ÿþ<!DOCTYPE html><html lang="en"><head><meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" /><link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous" /><title>Cosmic Ray Report</title></head><body><div class="container"><h1><p class="text-dark">Cosmic Ray Report</p></h1></div><div class="container"><div class="mb-1" id="summary_info___accordion"><div class="card"><a data-toggle="collapse" data-target="#summary_info___collapse_1" aria-expanded="true" aria-controls="summary_info___collapse_1" href="#"><div class="card-header" id="summary_info___heading_1"><button class="btn btn-outline-dark"><h4 class="m-0">Summary info</h4></button></div></a><div aria-labelledby="summary_info___heading_1" data-parent="#summary_info___accordion" class="collapse show" id="summary_info___collapse_1"><div class="card-body"><p>Date time: 17/10/2025 08:32:48</p><p>Total jobs: 2737</p><p>Complete: 2737 (100.00%)</p><p>Surviving mutants: 1266 (46.26%)</p></div></div></div></div><div class="mb-1" id="job_list___accordion"><div class="card"><a data-toggle="collapse" data-target="#job_list___collapse_1" aria-expanded="false" aria-controls="job_list___collapse_1" href="#"><div class="card-header" id="job_list___heading_1"><button class="btn btn-outline-dark"><h4 class="m-0">Job list</h4></button></div></a><div aria-labelledby="job_list___heading_1" data-parent="#job_list___accordion" class="collapse" id="job_list___collapse_1"><div class="card-body"><div class="text-right mb-1"><div class="mx-1" id="job_item_expand_all"><a href="#" onclick="$('div.job_list___sub_multi_collapse').collapse('show');"><button class="btn btn-outline-dark"><span>Expand All</span></button></a></div><div class="mx-1" id="job_item_collapse_all"><a href="#" onclick="$('div.job_list___sub_multi_collapse').collapse('hide');"><button class="btn btn-outline-dark"><span>Collapse All</span></button></a></div></div><div class="mb-1" id="job_list___sub_accordion_1"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1_1"><button class="btn btn-outline-danger"><span class="job_id">1 : Job ID 2c149afc46e946ecaada737f2a2d1a4e</span></button></div></a><div aria-labelledby="job_list___sub_heading_1_1" data-parent="#job_list___sub_accordion_1" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=34" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (34, 21), end pos: (34, 22)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_Add, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -31,7 +31,7 @@ render_prometheus, ) -MAX_DB_INT = (2**63) - 1 +MAX_DB_INT = (2**63) + 1 RMAPHandler = None # default if not os.environ.get("TATOU_TEST_DISABLE_RMAP"):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.18s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2_1"><button class="btn btn-outline-danger"><span class="job_id">2 : Job ID 2cb61a5dec6b4a1fb7b51272e06cf640</span></button></div></a><div aria-labelledby="job_list___sub_heading_2_1" data-parent="#job_list___sub_accordion_2" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=156" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (156, 34), end pos: (156, 35)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_Add, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -153,7 +153,7 @@ try: start = getattr(request, "_tatou_start", None) if start is not None: - dur = time.time() - start + dur = time.time() + start route = request.url_rule.rule if request.url_rule else request.path record_request(request.method, route, resp.status_code, dur) except Exception as exc: # pragma: no cover - defensive</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.07s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_3"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_3_1" aria-expanded="false" aria-controls="job_list___sub_collapse_3_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_3_1"><button class="btn btn-outline-success"><span class="job_id">3 : Job ID 81eee642d18f4439afee09796ca79abc</span></button></div></a><div aria-labelledby="job_list___sub_heading_3_1" data-parent="#job_list___sub_accordion_3" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_3_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=229" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (229, 58), end pos: (229, 59)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_Add, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -226,7 +226,7 @@ text("SELECT id, email, login FROM Users WHERE id = :id"), {"id": uid}, ).one() - observe_db_latency("create_user", time.time() - start_db) + observe_db_latency("create_user", time.time() + start_db) except IntegrityError: app.logger.warning( "Attempt to create duplicate user: email=%s, login=%s", email, login</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T002815878737Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T002816843900Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.29s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_4"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_4_1" aria-expanded="false" aria-controls="job_list___sub_collapse_4_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_4_1"><button class="btn btn-outline-danger"><span class="job_id">4 : Job ID 2497dc9370c044f69c9c95000ba75c0c</span></button></div></a><div aria-labelledby="job_list___sub_heading_4_1" data-parent="#job_list___sub_accordion_4" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_4_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=284" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (284, 55), end pos: (284, 56)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_Add, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -281,7 +281,7 @@ inc_db_error("login_select") return jsonify({"error": "An error occurred"}), 503 - observe_db_latency("login_select", time.time() - start_db) + observe_db_latency("login_select", time.time() + start_db) token = _serializer().dumps( {"uid": int(row.id), "login": row.login, "email": row.email} )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.99s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_5"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_5_1" aria-expanded="false" aria-controls="job_list___sub_collapse_5_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_5_1"><button class="btn btn-outline-success"><span class="job_id">5 : Job ID f766276828b14adb8fc5701c909b5868</span></button></div></a><div aria-labelledby="job_list___sub_heading_5_1" data-parent="#job_list___sub_accordion_5" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_5_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=401" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (401, 58), end pos: (401, 59)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_Add, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -398,7 +398,7 @@ inc_db_error("insert_document") return jsonify({"error": "database error occurred"}), 503 - observe_db_latency("insert_document", time.time() - start_db) + observe_db_latency("insert_document", time.time() + start_db) resp_data = { "id": int(row.id), "name": row.name,</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T041104871909Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T041106063598Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 21.41s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_6"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_6_1" aria-expanded="false" aria-controls="job_list___sub_collapse_6_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_6_1"><button class="btn btn-outline-success"><span class="job_id">6 : Job ID 6f6a1c3460954b5499e509dbd882913f</span></button></div></a><div aria-labelledby="job_list___sub_heading_6_1" data-parent="#job_list___sub_accordion_6" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_6_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1023" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1023, 59), end pos: (1023, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_Add, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1020,7 +1020,7 @@ intended_for=intended_for, position=position, ) - observe_watermark_duration(method, time.time() - _wm_start) + observe_watermark_duration(method, time.time() + _wm_start) if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: inc_watermark_failed(method, "empty_output") app.logger.error(</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T005143211686Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T005144142001Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.41s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_7"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_7_1" aria-expanded="false" aria-controls="job_list___sub_collapse_7_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_7_1"><button class="btn btn-outline-danger"><span class="job_id">7 : Job ID 1a15db4eb23a4797b5c1717e2dbd0e81</span></button></div></a><div aria-labelledby="job_list___sub_heading_7_1" data-parent="#job_list___sub_accordion_7" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_7_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=34" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (34, 21), end pos: (34, 22)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_Mul, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -31,7 +31,7 @@ render_prometheus, ) -MAX_DB_INT = (2**63) - 1 +MAX_DB_INT = (2**63) * 1 RMAPHandler = None # default if not os.environ.get("TATOU_TEST_DISABLE_RMAP"):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.02s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_8"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_8_1" aria-expanded="false" aria-controls="job_list___sub_collapse_8_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_8_1"><button class="btn btn-outline-danger"><span class="job_id">8 : Job ID 1b35c46511a44e4a923b24e6800ff8d9</span></button></div></a><div aria-labelledby="job_list___sub_heading_8_1" data-parent="#job_list___sub_accordion_8" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_8_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=156" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (156, 34), end pos: (156, 35)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_Mul, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -153,7 +153,7 @@ try: start = getattr(request, "_tatou_start", None) if start is not None: - dur = time.time() - start + dur = time.time() * start route = request.url_rule.rule if request.url_rule else request.path record_request(request.method, route, resp.status_code, dur) except Exception as exc: # pragma: no cover - defensive</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.10s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_9"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_9_1" aria-expanded="false" aria-controls="job_list___sub_collapse_9_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_9_1"><button class="btn btn-outline-danger"><span class="job_id">9 : Job ID e999c67b6a514539bb3615b28a157c1c</span></button></div></a><div aria-labelledby="job_list___sub_heading_9_1" data-parent="#job_list___sub_accordion_9" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_9_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=229" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (229, 58), end pos: (229, 59)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_Mul, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -226,7 +226,7 @@ text("SELECT id, email, login FROM Users WHERE id = :id"), {"id": uid}, ).one() - observe_db_latency("create_user", time.time() - start_db) + observe_db_latency("create_user", time.time() * start_db) except IntegrityError: app.logger.warning( "Attempt to create duplicate user: email=%s, login=%s", email, login</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.63s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_10"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_10_1" aria-expanded="false" aria-controls="job_list___sub_collapse_10_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_10_1"><button class="btn btn-outline-success"><span class="job_id">10 : Job ID b313b07482b64aa8ac86169ec9155cef</span></button></div></a><div aria-labelledby="job_list___sub_heading_10_1" data-parent="#job_list___sub_accordion_10" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_10_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=284" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (284, 55), end pos: (284, 56)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_Mul, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -281,7 +281,7 @@ inc_db_error("login_select") return jsonify({"error": "An error occurred"}), 503 - observe_db_latency("login_select", time.time() - start_db) + observe_db_latency("login_select", time.time() * start_db) token = _serializer().dumps( {"uid": int(row.id), "login": row.login, "email": row.email} )</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T061434372220Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T061435219157Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.87s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_11"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_11_1" aria-expanded="false" aria-controls="job_list___sub_collapse_11_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_11_1"><button class="btn btn-outline-success"><span class="job_id">11 : Job ID 7267f292bc1b41d7971993c67e8bc802</span></button></div></a><div aria-labelledby="job_list___sub_heading_11_1" data-parent="#job_list___sub_accordion_11" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_11_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=401" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (401, 58), end pos: (401, 59)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_Mul, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -398,7 +398,7 @@ inc_db_error("insert_document") return jsonify({"error": "database error occurred"}), 503 - observe_db_latency("insert_document", time.time() - start_db) + observe_db_latency("insert_document", time.time() * start_db) resp_data = { "id": int(row.id), "name": row.name,</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614eddcd781321896b72: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.83s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_12"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_12_1" aria-expanded="false" aria-controls="job_list___sub_collapse_12_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_12_1"><button class="btn btn-outline-danger"><span class="job_id">12 : Job ID 8ad5f16f2ca3478fb85250966329469a</span></button></div></a><div aria-labelledby="job_list___sub_heading_12_1" data-parent="#job_list___sub_accordion_12" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_12_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1023" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1023, 59), end pos: (1023, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_Mul, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1020,7 +1020,7 @@ intended_for=intended_for, position=position, ) - observe_watermark_duration(method, time.time() - _wm_start) + observe_watermark_duration(method, time.time() * _wm_start) if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: inc_watermark_failed(method, "empty_output") app.logger.error(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.80s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_13"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_13_1" aria-expanded="false" aria-controls="job_list___sub_collapse_13_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_13_1"><button class="btn btn-outline-danger"><span class="job_id">13 : Job ID 4b7d9a1df9a143a8a4828d827e60dc87</span></button></div></a><div aria-labelledby="job_list___sub_heading_13_1" data-parent="#job_list___sub_accordion_13" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_13_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=34" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (34, 21), end pos: (34, 22)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_Div, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -31,7 +31,7 @@ render_prometheus, ) -MAX_DB_INT = (2**63) - 1 +MAX_DB_INT = (2**63) / 1 RMAPHandler = None # default if not os.environ.get("TATOU_TEST_DISABLE_RMAP"):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.36s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_14"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_14_1" aria-expanded="false" aria-controls="job_list___sub_collapse_14_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_14_1"><button class="btn btn-outline-success"><span class="job_id">14 : Job ID 467d558def5f491296a7d37053286de5</span></button></div></a><div aria-labelledby="job_list___sub_heading_14_1" data-parent="#job_list___sub_accordion_14" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_14_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=156" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (156, 34), end pos: (156, 35)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_Div, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -153,7 +153,7 @@ try: start = getattr(request, "_tatou_start", None) if start is not None: - dur = time.time() - start + dur = time.time() / start route = request.url_rule.rule if request.url_rule else request.path record_request(request.method, route, resp.status_code, dur) except Exception as exc: # pragma: no cover - defensive</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T002509593209Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T002510631075Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.44s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_15"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_15_1" aria-expanded="false" aria-controls="job_list___sub_collapse_15_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_15_1"><button class="btn btn-outline-danger"><span class="job_id">15 : Job ID 8b15e2bc53b34c418a128d369928df91</span></button></div></a><div aria-labelledby="job_list___sub_heading_15_1" data-parent="#job_list___sub_accordion_15" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_15_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=229" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (229, 58), end pos: (229, 59)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_Div, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -226,7 +226,7 @@ text("SELECT id, email, login FROM Users WHERE id = :id"), {"id": uid}, ).one() - observe_db_latency("create_user", time.time() - start_db) + observe_db_latency("create_user", time.time() / start_db) except IntegrityError: app.logger.warning( "Attempt to create duplicate user: email=%s, login=%s", email, login</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.78s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_16"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_16_1" aria-expanded="false" aria-controls="job_list___sub_collapse_16_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_16_1"><button class="btn btn-outline-success"><span class="job_id">16 : Job ID 00693d9ee5eb4d91a7193bdd8f25934e</span></button></div></a><div aria-labelledby="job_list___sub_heading_16_1" data-parent="#job_list___sub_accordion_16" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_16_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=284" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (284, 55), end pos: (284, 56)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_Div, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -281,7 +281,7 @@ inc_db_error("login_select") return jsonify({"error": "An error occurred"}), 503 - observe_db_latency("login_select", time.time() - start_db) + observe_db_latency("login_select", time.time() / start_db) token = _serializer().dumps( {"uid": int(row.id), "login": row.login, "email": row.email} )</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%]</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_17"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_17_1" aria-expanded="false" aria-controls="job_list___sub_collapse_17_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_17_1"><button class="btn btn-outline-danger"><span class="job_id">17 : Job ID a73e9188ea62442eb7912df349c11527</span></button></div></a><div aria-labelledby="job_list___sub_heading_17_1" data-parent="#job_list___sub_accordion_17" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_17_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=401" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (401, 58), end pos: (401, 59)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_Div, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -398,7 +398,7 @@ inc_db_error("insert_document") return jsonify({"error": "database error occurred"}), 503 - observe_db_latency("insert_document", time.time() - start_db) + observe_db_latency("insert_document", time.time() / start_db) resp_data = { "id": int(row.id), "name": row.name,</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.16s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_18"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_18_1" aria-expanded="false" aria-controls="job_list___sub_collapse_18_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_18_1"><button class="btn btn-outline-danger"><span class="job_id">18 : Job ID 7fe6a37541bf4aa7ac93bf078686e454</span></button></div></a><div aria-labelledby="job_list___sub_heading_18_1" data-parent="#job_list___sub_accordion_18" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_18_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1023" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1023, 59), end pos: (1023, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_Div, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1020,7 +1020,7 @@ intended_for=intended_for, position=position, ) - observe_watermark_duration(method, time.time() - _wm_start) + observe_watermark_duration(method, time.time() / _wm_start) if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: inc_watermark_failed(method, "empty_output") app.logger.error(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.90s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_19"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_19_1" aria-expanded="false" aria-controls="job_list___sub_collapse_19_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_19_1"><button class="btn btn-outline-danger"><span class="job_id">19 : Job ID 918d5f93721142209e67d95d3e4fde10</span></button></div></a><div aria-labelledby="job_list___sub_heading_19_1" data-parent="#job_list___sub_accordion_19" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_19_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=34" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (34, 21), end pos: (34, 22)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_FloorDiv, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -31,7 +31,7 @@ render_prometheus, ) -MAX_DB_INT = (2**63) - 1 +MAX_DB_INT = (2**63) // 1 RMAPHandler = None # default if not os.environ.get("TATOU_TEST_DISABLE_RMAP"):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.18s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_20"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_20_1" aria-expanded="false" aria-controls="job_list___sub_collapse_20_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_20_1"><button class="btn btn-outline-danger"><span class="job_id">20 : Job ID c71eb20fb8bc4644a93c05b1087a4a14</span></button></div></a><div aria-labelledby="job_list___sub_heading_20_1" data-parent="#job_list___sub_accordion_20" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_20_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=156" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (156, 34), end pos: (156, 35)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_FloorDiv, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -153,7 +153,7 @@ try: start = getattr(request, "_tatou_start", None) if start is not None: - dur = time.time() - start + dur = time.time() // start route = request.url_rule.rule if request.url_rule else request.path record_request(request.method, route, resp.status_code, dur) except Exception as exc: # pragma: no cover - defensive</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.86s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_21"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_21_1" aria-expanded="false" aria-controls="job_list___sub_collapse_21_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_21_1"><button class="btn btn-outline-danger"><span class="job_id">21 : Job ID 54e35f2ff604476bac3f274762d56650</span></button></div></a><div aria-labelledby="job_list___sub_heading_21_1" data-parent="#job_list___sub_accordion_21" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_21_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=229" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (229, 58), end pos: (229, 59)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_FloorDiv, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -226,7 +226,7 @@ text("SELECT id, email, login FROM Users WHERE id = :id"), {"id": uid}, ).one() - observe_db_latency("create_user", time.time() - start_db) + observe_db_latency("create_user", time.time() // start_db) except IntegrityError: app.logger.warning( "Attempt to create duplicate user: email=%s, login=%s", email, login</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.15s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_22"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_22_1" aria-expanded="false" aria-controls="job_list___sub_collapse_22_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_22_1"><button class="btn btn-outline-success"><span class="job_id">22 : Job ID 6fd516c4a4974bc29a8f5552d2fb0af2</span></button></div></a><div aria-labelledby="job_list___sub_heading_22_1" data-parent="#job_list___sub_accordion_22" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_22_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=284" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (284, 55), end pos: (284, 56)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_FloorDiv, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -281,7 +281,7 @@ inc_db_error("login_select") return jsonify({"error": "An error occurred"}), 503 - observe_db_latency("login_select", time.time() - start_db) + observe_db_latency("login_select", time.time() // start_db) token = _serializer().dumps( {"uid": int(row.id), "login": row.login, "email": row.email} )</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e7e8e4456f9799de0: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.91s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_23"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_23_1" aria-expanded="false" aria-controls="job_list___sub_collapse_23_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_23_1"><button class="btn btn-outline-danger"><span class="job_id">23 : Job ID 2545957a5a0b4e1eb5de9f36695a0724</span></button></div></a><div aria-labelledby="job_list___sub_heading_23_1" data-parent="#job_list___sub_accordion_23" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_23_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=401" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (401, 58), end pos: (401, 59)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_FloorDiv, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -398,7 +398,7 @@ inc_db_error("insert_document") return jsonify({"error": "database error occurred"}), 503 - observe_db_latency("insert_document", time.time() - start_db) + observe_db_latency("insert_document", time.time() // start_db) resp_data = { "id": int(row.id), "name": row.name,</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.39s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_24"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_24_1" aria-expanded="false" aria-controls="job_list___sub_collapse_24_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_24_1"><button class="btn btn-outline-danger"><span class="job_id">24 : Job ID 395f2c3a090c4b63a2e1adda1b2234b4</span></button></div></a><div aria-labelledby="job_list___sub_heading_24_1" data-parent="#job_list___sub_accordion_24" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_24_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1023" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1023, 59), end pos: (1023, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_FloorDiv, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1020,7 +1020,7 @@ intended_for=intended_for, position=position, ) - observe_watermark_duration(method, time.time() - _wm_start) + observe_watermark_duration(method, time.time() // _wm_start) if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: inc_watermark_failed(method, "empty_output") app.logger.error(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.77s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_25"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_25_1" aria-expanded="false" aria-controls="job_list___sub_collapse_25_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_25_1"><button class="btn btn-outline-success"><span class="job_id">25 : Job ID 169de8c0e92b4a969173248200575d2d</span></button></div></a><div aria-labelledby="job_list___sub_heading_25_1" data-parent="#job_list___sub_accordion_25" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_25_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=34" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (34, 21), end pos: (34, 22)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_Mod, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -31,7 +31,7 @@ render_prometheus, ) -MAX_DB_INT = (2**63) - 1 +MAX_DB_INT = (2**63) % 1 RMAPHandler = None # default if not os.environ.get("TATOU_TEST_DISABLE_RMAP"):</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T142557952503Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse 33 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:463 Invalid document id in query ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 42 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T142558960779Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse streamed [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:824 Non-positive document id for deletion: 2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 400 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 400 == 200 10 failed, 4 passed, 22 warnings in 20.44s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_26"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_26_1" aria-expanded="false" aria-controls="job_list___sub_collapse_26_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_26_1"><button class="btn btn-outline-success"><span class="job_id">26 : Job ID ee1d0e61f1ba4e7e813f9fdf2e39ff1f</span></button></div></a><div aria-labelledby="job_list___sub_heading_26_1" data-parent="#job_list___sub_accordion_26" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_26_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=156" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (156, 34), end pos: (156, 35)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_Mod, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -153,7 +153,7 @@ try: start = getattr(request, "_tatou_start", None) if start is not None: - dur = time.time() - start + dur = time.time() % start route = request.url_rule.rule if request.url_rule else request.path record_request(request.method, route, resp.status_code, dur) except Exception as exc: # pragma: no cover - defensive</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T053046906206Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T053047850686Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.83s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_27"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_27_1" aria-expanded="false" aria-controls="job_list___sub_collapse_27_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_27_1"><button class="btn btn-outline-danger"><span class="job_id">27 : Job ID d176b658404448389d9d9f009f01614a</span></button></div></a><div aria-labelledby="job_list___sub_heading_27_1" data-parent="#job_list___sub_accordion_27" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_27_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=229" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (229, 58), end pos: (229, 59)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_Mod, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -226,7 +226,7 @@ text("SELECT id, email, login FROM Users WHERE id = :id"), {"id": uid}, ).one() - observe_db_latency("create_user", time.time() - start_db) + observe_db_latency("create_user", time.time() % start_db) except IntegrityError: app.logger.warning( "Attempt to create duplicate user: email=%s, login=%s", email, login</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.24s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_28"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_28_1" aria-expanded="false" aria-controls="job_list___sub_collapse_28_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_28_1"><button class="btn btn-outline-success"><span class="job_id">28 : Job ID 5b1d3ecd673148e28cb1a8c071efe8a3</span></button></div></a><div aria-labelledby="job_list___sub_heading_28_1" data-parent="#job_list___sub_accordion_28" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_28_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=284" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (284, 55), end pos: (284, 56)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_Mod, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -281,7 +281,7 @@ inc_db_error("login_select") return jsonify({"error": "An error occurred"}), 503 - observe_db_latency("login_select", time.time() - start_db) + observe_db_latency("login_select", time.time() % start_db) token = _serializer().dumps( {"uid": int(row.id), "login": row.login, "email": row.email} )</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T155705530425Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T155706412793Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.39s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_29"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_29_1" aria-expanded="false" aria-controls="job_list___sub_collapse_29_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_29_1"><button class="btn btn-outline-danger"><span class="job_id">29 : Job ID 89ec0c8472764d3a94301e24b08f67a4</span></button></div></a><div aria-labelledby="job_list___sub_heading_29_1" data-parent="#job_list___sub_accordion_29" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_29_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=401" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (401, 58), end pos: (401, 59)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_Mod, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -398,7 +398,7 @@ inc_db_error("insert_document") return jsonify({"error": "database error occurred"}), 503 - observe_db_latency("insert_document", time.time() - start_db) + observe_db_latency("insert_document", time.time() % start_db) resp_data = { "id": int(row.id), "name": row.name,</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.12s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_30"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_30_1" aria-expanded="false" aria-controls="job_list___sub_collapse_30_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_30_1"><button class="btn btn-outline-success"><span class="job_id">30 : Job ID b3a0e5f25fe948aa91e32aad84103093</span></button></div></a><div aria-labelledby="job_list___sub_heading_30_1" data-parent="#job_list___sub_accordion_30" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_30_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1023" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1023, 59), end pos: (1023, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_Mod, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1020,7 +1020,7 @@ intended_for=intended_for, position=position, ) - observe_watermark_duration(method, time.time() - _wm_start) + observe_watermark_duration(method, time.time() % _wm_start) if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: inc_watermark_failed(method, "empty_output") app.logger.error(</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T153913260140Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T153914148572Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.20s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_31"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_31_1" aria-expanded="false" aria-controls="job_list___sub_collapse_31_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_31_1"><button class="btn btn-outline-danger"><span class="job_id">31 : Job ID 19d8dd0055de4c87b0b419abc74d06d8</span></button></div></a><div aria-labelledby="job_list___sub_heading_31_1" data-parent="#job_list___sub_accordion_31" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_31_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=34" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (34, 21), end pos: (34, 22)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_Pow, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -31,7 +31,7 @@ render_prometheus, ) -MAX_DB_INT = (2**63) - 1 +MAX_DB_INT = (2**63) ** 1 RMAPHandler = None # default if not os.environ.get("TATOU_TEST_DISABLE_RMAP"):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.19s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_32"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_32_1" aria-expanded="false" aria-controls="job_list___sub_collapse_32_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_32_1"><button class="btn btn-outline-danger"><span class="job_id">32 : Job ID 55482966083741658d0eace21fcc6656</span></button></div></a><div aria-labelledby="job_list___sub_heading_32_1" data-parent="#job_list___sub_accordion_32" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_32_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=156" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (156, 34), end pos: (156, 35)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_Pow, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -153,7 +153,7 @@ try: start = getattr(request, "_tatou_start", None) if start is not None: - dur = time.time() - start + dur = time.time() ** start route = request.url_rule.rule if request.url_rule else request.path record_request(request.method, route, resp.status_code, dur) except Exception as exc: # pragma: no cover - defensive</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.18s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_33"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_33_1" aria-expanded="false" aria-controls="job_list___sub_collapse_33_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_33_1"><button class="btn btn-outline-success"><span class="job_id">33 : Job ID f66fed469088480090122fc9984b5d3d</span></button></div></a><div aria-labelledby="job_list___sub_heading_33_1" data-parent="#job_list___sub_accordion_33" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_33_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=229" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (229, 58), end pos: (229, 59)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_Pow, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -226,7 +226,7 @@ text("SELECT id, email, login FROM Users WHERE id = :id"), {"id": uid}, ).one() - observe_db_latency("create_user", time.time() - start_db) + observe_db_latency("create_user", time.time() ** start_db) except IntegrityError: app.logger.warning( "Attempt to create duplicate user: email=%s, login=%s", email, login</pre></div><div class="alert alert-secondary"><pre class="diff">.F............ [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (34, 'Result too large') ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 1 failed, 13 passed, 22 warnings in 20.69s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_34"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_34_1" aria-expanded="false" aria-controls="job_list___sub_collapse_34_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_34_1"><button class="btn btn-outline-success"><span class="job_id">34 : Job ID 9a4d831a2a8740efa7547b3245ff2155</span></button></div></a><div aria-labelledby="job_list___sub_heading_34_1" data-parent="#job_list___sub_accordion_34" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_34_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=284" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (284, 55), end pos: (284, 56)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_Pow, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -281,7 +281,7 @@ inc_db_error("login_select") return jsonify({"error": "An error occurred"}), 503 - observe_db_latency("login_select", time.time() - start_db) + observe_db_latency("login_select", time.time() ** start_db) token = _serializer().dumps( {"uid": int(row.id), "login": row.login, "email": row.email} )</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T173127700387Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T173128553594Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.89s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_35"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_35_1" aria-expanded="false" aria-controls="job_list___sub_collapse_35_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_35_1"><button class="btn btn-outline-success"><span class="job_id">35 : Job ID 7f0d311404144bf9a0de9caf384faf01</span></button></div></a><div aria-labelledby="job_list___sub_heading_35_1" data-parent="#job_list___sub_accordion_35" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_35_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=401" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (401, 58), end pos: (401, 59)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_Pow, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -398,7 +398,7 @@ inc_db_error("insert_document") return jsonify({"error": "database error occurred"}), 503 - observe_db_latency("insert_document", time.time() - start_db) + observe_db_latency("insert_document", time.time() ** start_db) resp_data = { "id": int(row.id), "name": row.name,</pre></div><div class="alert alert-secondary"><pre class="diff">...F......F... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } &gt; resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:147: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 user_dir = app.config["STORAGE_DIR"] / "files" / g.user["login"] user_dir.mkdir(parents=True, exist_ok=True) ts = dt.datetime.now(dt.UTC).strftime("%Y%m%dT%H%M%S%fZ") final_name = request.form.get("name") or fname stored_name = f"{ts}__{fname}" try: # Check for path traversal attempts stored_path = (user_dir / stored_name).resolve() if not str(stored_path).startswith(str(user_dir.resolve())): app.logger.warning("Upload attempt with invalid path: %s", stored_path) return jsonify({"error": "invalid path"}), 400 file.save(stored_path) except Exception as e: app.logger.error("File save error: %s", e) return jsonify({"error": "failed to save file"}), 500 sha_hex = _sha256_file(stored_path) size = stored_path.stat().st_size try: with get_engine().begin() as conn: conn.execute( text( """ INSERT INTO Documents (name, path, ownerid, sha256, size) VALUES (:name, :path, :ownerid, UNHEX(:sha256hex), :size) """ ), { "name": final_name, "path": str(stored_path), "ownerid": int(g.user["id"]), "sha256hex": sha_hex, "size": int(size), }, ) did = int(conn.execute(text("SELECT LAST_INSERT_ID()")).scalar()) row = conn.execute( text( """ SELECT id, name, creation, HEX(sha256) AS sha256_hex, size FROM Documents WHERE id = :id """ ), {"id": did}, ).one() except Exception: stored_path.unlink(missing_ok=True) app.logger.error( "Database error inserting document path=%s user=%s", stored_path, int(g.user["id"]), ) inc_db_error("insert_document") return jsonify({"error": "database error occurred"}), 503 &gt; observe_db_latency("insert_document", time.time() ** start_db) ^^^^^^^^^^^^^^^^^^^^^^^ E OverflowError: (34, 'Result too large') server.py:401: OverflowError __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } &gt; upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:387: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 user_dir = app.config["STORAGE_DIR"] / "files" / g.user["login"] user_dir.mkdir(parents=True, exist_ok=True) ts = dt.datetime.now(dt.UTC).strftime("%Y%m%dT%H%M%S%fZ") final_name = request.form.get("name") or fname stored_name = f"{ts}__{fname}" try: # Check for path traversal attempts stored_path = (user_dir / stored_name).resolve() if not str(stored_path).startswith(str(user_dir.resolve())): app.logger.warning("Upload attempt with invalid path: %s", stored_path) return jsonify({"error": "invalid path"}), 400 file.save(stored_path) except Exception as e: app.logger.error("File save error: %s", e) return jsonify({"error": "failed to save file"}), 500 sha_hex = _sha256_file(stored_path) size = stored_path.stat().st_size try: with get_engine().begin() as conn: conn.execute( text( """ INSERT INTO Documents (name, path, ownerid, sha256, size) VALUES (:name, :path, :ownerid, UNHEX(:sha256hex), :size) """ ), { "name": final_name, "path": str(stored_path), "ownerid": int(g.user["id"]), "sha256hex": sha_hex, "size": int(size), }, ) did = int(conn.execute(text("SELECT LAST_INSERT_ID()")).scalar()) row = conn.execute( text( """ SELECT id, name, creation, HEX(sha256) AS sha256_hex, size FROM Documents WHERE id = :id """ ), {"id": did}, ).one() except Exception: stored_path.unlink(missing_ok=True) app.logger.error( "Database error inserting document path=%s user=%s", stored_path, int(g.user["id"]), ) inc_db_error("insert_document") return jsonify({"error": "database error occurred"}), 503 &gt; observe_db_latency("insert_document", time.time() ** start_db) ^^^^^^^^^^^^^^^^^^^^^^^ E OverflowError: (34, 'Result too large') server.py:401: OverflowError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OverflowError: (34, ... FAILED ..\test\test_api.py::test_read_watermark_route - OverflowError: (34, '... 2 failed, 12 passed, 22 warnings in 21.14s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_36"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_36_1" aria-expanded="false" aria-controls="job_list___sub_collapse_36_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_36_1"><button class="btn btn-outline-success"><span class="job_id">36 : Job ID fc089e2968724b24ae430361fbdf11d8</span></button></div></a><div aria-labelledby="job_list___sub_heading_36_1" data-parent="#job_list___sub_accordion_36" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_36_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1023" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1023, 59), end pos: (1023, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_Pow, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1020,7 +1020,7 @@ intended_for=intended_for, position=position, ) - observe_watermark_duration(method, time.time() - _wm_start) + observe_watermark_duration(method, time.time() ** _wm_start) if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: inc_watermark_failed(method, "empty_output") app.logger.error(</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1034 Watermarking failed for document 1 using method robust-xmp: (34, 'Result too large') ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 1 failed, 13 passed, 22 warnings in 20.22s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_37"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_37_1" aria-expanded="false" aria-controls="job_list___sub_collapse_37_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_37_1"><button class="btn btn-outline-danger"><span class="job_id">37 : Job ID 7c6dde36f9e6464e9a631450341e9843</span></button></div></a><div aria-labelledby="job_list___sub_heading_37_1" data-parent="#job_list___sub_accordion_37" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_37_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=34" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (34, 21), end pos: (34, 22)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_RShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -31,7 +31,7 @@ render_prometheus, ) -MAX_DB_INT = (2**63) - 1 +MAX_DB_INT = (2**63) &gt;&gt; 1 RMAPHandler = None # default if not os.environ.get("TATOU_TEST_DISABLE_RMAP"):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.55s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_38"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_38_1" aria-expanded="false" aria-controls="job_list___sub_collapse_38_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_38_1"><button class="btn btn-outline-danger"><span class="job_id">38 : Job ID 66940146aecb40e98697d24021afe2da</span></button></div></a><div aria-labelledby="job_list___sub_heading_38_1" data-parent="#job_list___sub_accordion_38" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_38_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=156" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (156, 34), end pos: (156, 35)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_RShift, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -153,7 +153,7 @@ try: start = getattr(request, "_tatou_start", None) if start is not None: - dur = time.time() - start + dur = time.time() &gt;&gt; start route = request.url_rule.rule if request.url_rule else request.path record_request(request.method, route, resp.status_code, dur) except Exception as exc: # pragma: no cover - defensive</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.33s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_39"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_39_1" aria-expanded="false" aria-controls="job_list___sub_collapse_39_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_39_1"><button class="btn btn-outline-success"><span class="job_id">39 : Job ID 8d96bfbe16de4e9f9bcde14424aa1aeb</span></button></div></a><div aria-labelledby="job_list___sub_heading_39_1" data-parent="#job_list___sub_accordion_39" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_39_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=229" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (229, 58), end pos: (229, 59)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_RShift, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -226,7 +226,7 @@ text("SELECT id, email, login FROM Users WHERE id = :id"), {"id": uid}, ).one() - observe_db_latency("create_user", time.time() - start_db) + observe_db_latency("create_user", time.time() &gt;&gt; start_db) except IntegrityError: app.logger.warning( "Attempt to create duplicate user: email=%s, login=%s", email, login</pre></div><div class="alert alert-secondary"><pre class="diff">.F............ [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: unsupported operand type(s) for &gt;&gt;: 'float' and 'float' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 1 failed, 13 passed, 22 warnings in 20.40s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_40"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_40_1" aria-expanded="false" aria-controls="job_list___sub_collapse_40_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_40_1"><button class="btn btn-outline-success"><span class="job_id">40 : Job ID 8f02ac555a5347f3987b3552078f5407</span></button></div></a><div aria-labelledby="job_list___sub_heading_40_1" data-parent="#job_list___sub_accordion_40" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_40_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=284" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (284, 55), end pos: (284, 56)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_RShift, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -281,7 +281,7 @@ inc_db_error("login_select") return jsonify({"error": "An error occurred"}), 503 - observe_db_latency("login_select", time.time() - start_db) + observe_db_latency("login_select", time.time() &gt;&gt; start_db) token = _serializer().dumps( {"uid": int(row.id), "login": row.login, "email": row.email} )</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T003615492719Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T003616408221Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.52s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_41"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_41_1" aria-expanded="false" aria-controls="job_list___sub_collapse_41_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_41_1"><button class="btn btn-outline-success"><span class="job_id">41 : Job ID 7e7f91d5ed0c423989b974acf4815313</span></button></div></a><div aria-labelledby="job_list___sub_heading_41_1" data-parent="#job_list___sub_accordion_41" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_41_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=401" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (401, 58), end pos: (401, 59)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_RShift, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -398,7 +398,7 @@ inc_db_error("insert_document") return jsonify({"error": "database error occurred"}), 503 - observe_db_latency("insert_document", time.time() - start_db) + observe_db_latency("insert_document", time.time() &gt;&gt; start_db) resp_data = { "id": int(row.id), "name": row.name,</pre></div><div class="alert alert-secondary"><pre class="diff">...F......F... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } &gt; resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:147: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 user_dir = app.config["STORAGE_DIR"] / "files" / g.user["login"] user_dir.mkdir(parents=True, exist_ok=True) ts = dt.datetime.now(dt.UTC).strftime("%Y%m%dT%H%M%S%fZ") final_name = request.form.get("name") or fname stored_name = f"{ts}__{fname}" try: # Check for path traversal attempts stored_path = (user_dir / stored_name).resolve() if not str(stored_path).startswith(str(user_dir.resolve())): app.logger.warning("Upload attempt with invalid path: %s", stored_path) return jsonify({"error": "invalid path"}), 400 file.save(stored_path) except Exception as e: app.logger.error("File save error: %s", e) return jsonify({"error": "failed to save file"}), 500 sha_hex = _sha256_file(stored_path) size = stored_path.stat().st_size try: with get_engine().begin() as conn: conn.execute( text( """ INSERT INTO Documents (name, path, ownerid, sha256, size) VALUES (:name, :path, :ownerid, UNHEX(:sha256hex), :size) """ ), { "name": final_name, "path": str(stored_path), "ownerid": int(g.user["id"]), "sha256hex": sha_hex, "size": int(size), }, ) did = int(conn.execute(text("SELECT LAST_INSERT_ID()")).scalar()) row = conn.execute( text( """ SELECT id, name, creation, HEX(sha256) AS sha256_hex, size FROM Documents WHERE id = :id """ ), {"id": did}, ).one() except Exception: stored_path.unlink(missing_ok=True) app.logger.error( "Database error inserting document path=%s user=%s", stored_path, int(g.user["id"]), ) inc_db_error("insert_document") return jsonify({"error": "database error occurred"}), 503 &gt; observe_db_latency("insert_document", time.time() &gt;&gt; start_db) ^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for &gt;&gt;: 'float' and 'float' server.py:401: TypeError __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } &gt; upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:387: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 user_dir = app.config["STORAGE_DIR"] / "files" / g.user["login"] user_dir.mkdir(parents=True, exist_ok=True) ts = dt.datetime.now(dt.UTC).strftime("%Y%m%dT%H%M%S%fZ") final_name = request.form.get("name") or fname stored_name = f"{ts}__{fname}" try: # Check for path traversal attempts stored_path = (user_dir / stored_name).resolve() if not str(stored_path).startswith(str(user_dir.resolve())): app.logger.warning("Upload attempt with invalid path: %s", stored_path) return jsonify({"error": "invalid path"}), 400 file.save(stored_path) except Exception as e: app.logger.error("File save error: %s", e) return jsonify({"error": "failed to save file"}), 500 sha_hex = _sha256_file(stored_path) size = stored_path.stat().st_size try: with get_engine().begin() as conn: conn.execute( text( """ INSERT INTO Documents (name, path, ownerid, sha256, size) VALUES (:name, :path, :ownerid, UNHEX(:sha256hex), :size) """ ), { "name": final_name, "path": str(stored_path), "ownerid": int(g.user["id"]), "sha256hex": sha_hex, "size": int(size), }, ) did = int(conn.execute(text("SELECT LAST_INSERT_ID()")).scalar()) row = conn.execute( text( """ SELECT id, name, creation, HEX(sha256) AS sha256_hex, size FROM Documents WHERE id = :id """ ), {"id": did}, ).one() except Exception: stored_path.unlink(missing_ok=True) app.logger.error( "Database error inserting document path=%s user=%s", stored_path, int(g.user["id"]), ) inc_db_error("insert_document") return jsonify({"error": "database error occurred"}), 503 &gt; observe_db_latency("insert_document", time.time() &gt;&gt; start_db) ^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for &gt;&gt;: 'float' and 'float' server.py:401: TypeError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - TypeError: unsupport... FAILED ..\test\test_api.py::test_read_watermark_route - TypeError: unsupporte... 2 failed, 12 passed, 22 warnings in 19.77s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_42"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_42_1" aria-expanded="false" aria-controls="job_list___sub_collapse_42_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_42_1"><button class="btn btn-outline-success"><span class="job_id">42 : Job ID 78dfed875d904d81b3737a8a3504f05a</span></button></div></a><div aria-labelledby="job_list___sub_heading_42_1" data-parent="#job_list___sub_accordion_42" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_42_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1023" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1023, 59), end pos: (1023, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_RShift, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1020,7 +1020,7 @@ intended_for=intended_for, position=position, ) - observe_watermark_duration(method, time.time() - _wm_start) + observe_watermark_duration(method, time.time() &gt;&gt; _wm_start) if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: inc_watermark_failed(method, "empty_output") app.logger.error(</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1034 Watermarking failed for document 1 using method robust-xmp: unsupported operand type(s) for &gt;&gt;: 'float' and 'float' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 1 failed, 13 passed, 22 warnings in 19.95s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_43"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_43_1" aria-expanded="false" aria-controls="job_list___sub_collapse_43_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_43_1"><button class="btn btn-outline-success"><span class="job_id">43 : Job ID 720f2ce84fa54af3907ca939b87826ac</span></button></div></a><div aria-labelledby="job_list___sub_heading_43_1" data-parent="#job_list___sub_accordion_43" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_43_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=34" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (34, 21), end pos: (34, 22)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_LShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -31,7 +31,7 @@ render_prometheus, ) -MAX_DB_INT = (2**63) - 1 +MAX_DB_INT = (2**63) &lt;&lt; 1 RMAPHandler = None # default if not os.environ.get("TATOU_TEST_DISABLE_RMAP"):</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e33f14556adcf53bd: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.68s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_44"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_44_1" aria-expanded="false" aria-controls="job_list___sub_collapse_44_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_44_1"><button class="btn btn-outline-danger"><span class="job_id">44 : Job ID bd118104127e454d84b115a4fdb0df27</span></button></div></a><div aria-labelledby="job_list___sub_heading_44_1" data-parent="#job_list___sub_accordion_44" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_44_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=156" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (156, 34), end pos: (156, 35)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_LShift, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -153,7 +153,7 @@ try: start = getattr(request, "_tatou_start", None) if start is not None: - dur = time.time() - start + dur = time.time() &lt;&lt; start route = request.url_rule.rule if request.url_rule else request.path record_request(request.method, route, resp.status_code, dur) except Exception as exc: # pragma: no cover - defensive</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.14s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_45"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_45_1" aria-expanded="false" aria-controls="job_list___sub_collapse_45_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_45_1"><button class="btn btn-outline-success"><span class="job_id">45 : Job ID c0d1c1e375664c1c9c55d612e1fe8091</span></button></div></a><div aria-labelledby="job_list___sub_heading_45_1" data-parent="#job_list___sub_accordion_45" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_45_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=229" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (229, 58), end pos: (229, 59)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_LShift, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -226,7 +226,7 @@ text("SELECT id, email, login FROM Users WHERE id = :id"), {"id": uid}, ).one() - observe_db_latency("create_user", time.time() - start_db) + observe_db_latency("create_user", time.time() &lt;&lt; start_db) except IntegrityError: app.logger.warning( "Attempt to create duplicate user: email=%s, login=%s", email, login</pre></div><div class="alert alert-secondary"><pre class="diff">.F.F.....FFF.F [100%]</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_46"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_46_1" aria-expanded="false" aria-controls="job_list___sub_collapse_46_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_46_1"><button class="btn btn-outline-success"><span class="job_id">46 : Job ID 658e29007ea241a3aeff702c71c71be0</span></button></div></a><div aria-labelledby="job_list___sub_heading_46_1" data-parent="#job_list___sub_accordion_46" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_46_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=284" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (284, 55), end pos: (284, 56)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_LShift, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -281,7 +281,7 @@ inc_db_error("login_select") return jsonify({"error": "An error occurred"}), 503 - observe_db_latency("login_select", time.time() - start_db) + observe_db_latency("login_select", time.time() &lt;&lt; start_db) token = _serializer().dumps( {"uid": int(row.id), "login": row.login, "email": row.email} )</pre></div><div class="alert alert-secondary"><pre class="diff">..F........... [100%] ================================== FAILURES =================================== ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret &gt; resp = client.post("/api/login", json=parameters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:111: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/login") def login(): payload = request.get_json(silent=True) or {} email = (payload.get("email") or "").strip() password = payload.get("password") or "" if not email or not password: app.logger.warning("Missing fields in login attempt: %s", payload) return jsonify({"error": "email and password are required"}), 400 start_db = time.time() try: with get_engine().connect() as conn: row = conn.execute( text( "SELECT id, email, login, hpassword FROM Users " "WHERE email = :email LIMIT 1" ), {"email": email}, ).first() # Constant-time comparison to prevent timing attacks if row: is_valid = check_password_hash(row.hpassword, password) else: # Dummy check to maintain constant time is_valid = False row = None if not is_valid: app.logger.warning( "Failed login attempt for email: %s", email if email else "&lt;empty&gt;", ) inc_login_failure("invalid_credentials") return jsonify({"error": "invalid credentials"}), 401 except Exception as e: app.logger.error("Database error in login: %s", e) inc_db_error("login_select") return jsonify({"error": "An error occurred"}), 503 &gt; observe_db_latency("login_select", time.time() &lt;&lt; start_db) ^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for &lt;&lt;: 'float' and 'float' server.py:284: TypeError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_login_route - TypeError: unsupported operand... 1 failed, 13 passed, 22 warnings in 20.77s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_47"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_47_1" aria-expanded="false" aria-controls="job_list___sub_collapse_47_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_47_1"><button class="btn btn-outline-success"><span class="job_id">47 : Job ID 55cb9c8fc7634e329b1d027f693a5c4e</span></button></div></a><div aria-labelledby="job_list___sub_heading_47_1" data-parent="#job_list___sub_accordion_47" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_47_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=401" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (401, 58), end pos: (401, 59)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_LShift, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -398,7 +398,7 @@ inc_db_error("insert_document") return jsonify({"error": "database error occurred"}), 503 - observe_db_latency("insert_document", time.time() - start_db) + observe_db_latency("insert_document", time.time() &lt;&lt; start_db) resp_data = { "id": int(row.id), "name": row.name,</pre></div><div class="alert alert-secondary"><pre class="diff">...F......F... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } &gt; resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:147: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 user_dir = app.config["STORAGE_DIR"] / "files" / g.user["login"] user_dir.mkdir(parents=True, exist_ok=True) ts = dt.datetime.now(dt.UTC).strftime("%Y%m%dT%H%M%S%fZ") final_name = request.form.get("name") or fname stored_name = f"{ts}__{fname}" try: # Check for path traversal attempts stored_path = (user_dir / stored_name).resolve() if not str(stored_path).startswith(str(user_dir.resolve())): app.logger.warning("Upload attempt with invalid path: %s", stored_path) return jsonify({"error": "invalid path"}), 400 file.save(stored_path) except Exception as e: app.logger.error("File save error: %s", e) return jsonify({"error": "failed to save file"}), 500 sha_hex = _sha256_file(stored_path) size = stored_path.stat().st_size try: with get_engine().begin() as conn: conn.execute( text( """ INSERT INTO Documents (name, path, ownerid, sha256, size) VALUES (:name, :path, :ownerid, UNHEX(:sha256hex), :size) """ ), { "name": final_name, "path": str(stored_path), "ownerid": int(g.user["id"]), "sha256hex": sha_hex, "size": int(size), }, ) did = int(conn.execute(text("SELECT LAST_INSERT_ID()")).scalar()) row = conn.execute( text( """ SELECT id, name, creation, HEX(sha256) AS sha256_hex, size FROM Documents WHERE id = :id """ ), {"id": did}, ).one() except Exception: stored_path.unlink(missing_ok=True) app.logger.error( "Database error inserting document path=%s user=%s", stored_path, int(g.user["id"]), ) inc_db_error("insert_document") return jsonify({"error": "database error occurred"}), 503 &gt; observe_db_latency("insert_document", time.time() &lt;&lt; start_db) ^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for &lt;&lt;: 'float' and 'float' server.py:401: TypeError __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } &gt; upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:387: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 user_dir = app.config["STORAGE_DIR"] / "files" / g.user["login"] user_dir.mkdir(parents=True, exist_ok=True) ts = dt.datetime.now(dt.UTC).strftime("%Y%m%dT%H%M%S%fZ") final_name = request.form.get("name") or fname stored_name = f"{ts}__{fname}" try: # Check for path traversal attempts stored_path = (user_dir / stored_name).resolve() if not str(stored_path).startswith(str(user_dir.resolve())): app.logger.warning("Upload attempt with invalid path: %s", stored_path) return jsonify({"error": "invalid path"}), 400 file.save(stored_path) except Exception as e: app.logger.error("File save error: %s", e) return jsonify({"error": "failed to save file"}), 500 sha_hex = _sha256_file(stored_path) size = stored_path.stat().st_size try: with get_engine().begin() as conn: conn.execute( text( """ INSERT INTO Documents (name, path, ownerid, sha256, size) VALUES (:name, :path, :ownerid, UNHEX(:sha256hex), :size) """ ), { "name": final_name, "path": str(stored_path), "ownerid": int(g.user["id"]), "sha256hex": sha_hex, "size": int(size), }, ) did = int(conn.execute(text("SELECT LAST_INSERT_ID()")).scalar()) row = conn.execute( text( """ SELECT id, name, creation, HEX(sha256) AS sha256_hex, size FROM Documents WHERE id = :id """ ), {"id": did}, ).one() except Exception: stored_path.unlink(missing_ok=True) app.logger.error( "Database error inserting document path=%s user=%s", stored_path, int(g.user["id"]), ) inc_db_error("insert_document") return jsonify({"error": "database error occurred"}), 503 &gt; observe_db_latency("insert_document", time.time() &lt;&lt; start_db) ^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for &lt;&lt;: 'float' and 'float' server.py:401: TypeError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - TypeError: unsupport... FAILED ..\test\test_api.py::test_read_watermark_route - TypeError: unsupporte... 2 failed, 12 passed, 22 warnings in 20.69s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_48"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_48_1" aria-expanded="false" aria-controls="job_list___sub_collapse_48_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_48_1"><button class="btn btn-outline-success"><span class="job_id">48 : Job ID c05c0c1761cb4f0eaa510e3129c40c70</span></button></div></a><div aria-labelledby="job_list___sub_heading_48_1" data-parent="#job_list___sub_accordion_48" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_48_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1023" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1023, 59), end pos: (1023, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_LShift, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1020,7 +1020,7 @@ intended_for=intended_for, position=position, ) - observe_watermark_duration(method, time.time() - _wm_start) + observe_watermark_duration(method, time.time() &lt;&lt; _wm_start) if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: inc_watermark_failed(method, "empty_output") app.logger.error(</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1034 Watermarking failed for document 1 using method robust-xmp: unsupported operand type(s) for &lt;&lt;: 'float' and 'float' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 1 failed, 13 passed, 22 warnings in 20.24s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_49"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_49_1" aria-expanded="false" aria-controls="job_list___sub_collapse_49_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_49_1"><button class="btn btn-outline-success"><span class="job_id">49 : Job ID 4af617ca028f408aadae8e0cd039c6f3</span></button></div></a><div aria-labelledby="job_list___sub_heading_49_1" data-parent="#job_list___sub_accordion_49" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_49_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=34" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (34, 21), end pos: (34, 22)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_BitOr, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -31,7 +31,7 @@ render_prometheus, ) -MAX_DB_INT = (2**63) - 1 +MAX_DB_INT = (2**63) | 1 RMAPHandler = None # default if not os.environ.get("TATOU_TEST_DISABLE_RMAP"):</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T024108036724Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T024108910263Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.27s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_50"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_50_1" aria-expanded="false" aria-controls="job_list___sub_collapse_50_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_50_1"><button class="btn btn-outline-danger"><span class="job_id">50 : Job ID 04ac5df0da36437abd33a12833a46a1c</span></button></div></a><div aria-labelledby="job_list___sub_heading_50_1" data-parent="#job_list___sub_accordion_50" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_50_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=156" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (156, 34), end pos: (156, 35)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_BitOr, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -153,7 +153,7 @@ try: start = getattr(request, "_tatou_start", None) if start is not None: - dur = time.time() - start + dur = time.time() | start route = request.url_rule.rule if request.url_rule else request.path record_request(request.method, route, resp.status_code, dur) except Exception as exc: # pragma: no cover - defensive</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.03s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_51"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_51_1" aria-expanded="false" aria-controls="job_list___sub_collapse_51_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_51_1"><button class="btn btn-outline-success"><span class="job_id">51 : Job ID d431f3f7bdd64711973252a158bc13a7</span></button></div></a><div aria-labelledby="job_list___sub_heading_51_1" data-parent="#job_list___sub_accordion_51" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_51_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=229" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (229, 58), end pos: (229, 59)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_BitOr, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -226,7 +226,7 @@ text("SELECT id, email, login FROM Users WHERE id = :id"), {"id": uid}, ).one() - observe_db_latency("create_user", time.time() - start_db) + observe_db_latency("create_user", time.time() | start_db) except IntegrityError: app.logger.warning( "Attempt to create duplicate user: email=%s, login=%s", email, login</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T060406351161Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T060407267731Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 20.27s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_52"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_52_1" aria-expanded="false" aria-controls="job_list___sub_collapse_52_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_52_1"><button class="btn btn-outline-success"><span class="job_id">52 : Job ID caabd09ab60b4a11a3dfe9f529602a58</span></button></div></a><div aria-labelledby="job_list___sub_heading_52_1" data-parent="#job_list___sub_accordion_52" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_52_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=284" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (284, 55), end pos: (284, 56)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_BitOr, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -281,7 +281,7 @@ inc_db_error("login_select") return jsonify({"error": "An error occurred"}), 503 - observe_db_latency("login_select", time.time() - start_db) + observe_db_latency("login_select", time.time() | start_db) token = _serializer().dumps( {"uid": int(row.id), "login": row.login, "email": row.email} )</pre></div><div class="alert alert-secondary"><pre class="diff">..FF.....FFF.F [100%] ================================== FAILURES =================================== ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret &gt; resp = client.post("/api/login", json=parameters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:111: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/login") def login(): payload = request.get_json(silent=True) or {} email = (payload.get("email") or "").strip() password = payload.get("password") or "" if not email or not password: app.logger.warning("Missing fields in login attempt: %s", payload) return jsonify({"error": "email and password are required"}), 400 start_db = time.time() try: with get_engine().connect() as conn: row = conn.execute( text( "SELECT id, email, login, hpassword FROM Users " "WHERE email = :email LIMIT 1" ), {"email": email}, ).first() # Constant-time comparison to prevent timing attacks if row: is_valid = check_password_hash(row.hpassword, password) else: # Dummy check to maintain constant time is_valid = False row = None if not is_valid: app.logger.warning( "Failed login attempt for email: %s", email if email else "&lt;empty&gt;", ) inc_login_failure("invalid_credentials") return jsonify({"error": "invalid credentials"}), 401 except Exception as e: app.logger.error("Database error in login: %s", e) inc_db_error("login_select") return jsonify({"error": "An error occurred"}), 503 &gt; observe_db_latency("login_select", time.time() | start_db) ^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for |: 'float' and 'float' server.py:284: TypeError _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e5dc1d50c8fa83b5c: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_login_route - TypeError: unsupported operand... FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 6 failed, 8 passed, 22 warnings in 20.11s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_53"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_53_1" aria-expanded="false" aria-controls="job_list___sub_collapse_53_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_53_1"><button class="btn btn-outline-success"><span class="job_id">53 : Job ID c29e520d46f24dc285685ba7de611a68</span></button></div></a><div aria-labelledby="job_list___sub_heading_53_1" data-parent="#job_list___sub_accordion_53" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_53_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=401" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (401, 58), end pos: (401, 59)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_BitOr, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -398,7 +398,7 @@ inc_db_error("insert_document") return jsonify({"error": "database error occurred"}), 503 - observe_db_latency("insert_document", time.time() - start_db) + observe_db_latency("insert_document", time.time() | start_db) resp_data = { "id": int(row.id), "name": row.name,</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T015934859041Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T015935779550Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.32s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_54"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_54_1" aria-expanded="false" aria-controls="job_list___sub_collapse_54_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_54_1"><button class="btn btn-outline-success"><span class="job_id">54 : Job ID 484c2cbc9d764115993f9ccbdc1d3d35</span></button></div></a><div aria-labelledby="job_list___sub_heading_54_1" data-parent="#job_list___sub_accordion_54" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_54_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1023" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1023, 59), end pos: (1023, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_BitOr, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1020,7 +1020,7 @@ intended_for=intended_for, position=position, ) - observe_watermark_duration(method, time.time() - _wm_start) + observe_watermark_duration(method, time.time() | _wm_start) if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: inc_watermark_failed(method, "empty_output") app.logger.error(</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T171318917099Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T171319767067Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.24s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_55"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_55_1" aria-expanded="false" aria-controls="job_list___sub_collapse_55_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_55_1"><button class="btn btn-outline-success"><span class="job_id">55 : Job ID 53b5e132fa2b4641a6f13a45f8e1be3a</span></button></div></a><div aria-labelledby="job_list___sub_heading_55_1" data-parent="#job_list___sub_accordion_55" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_55_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=34" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (34, 21), end pos: (34, 22)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_BitAnd, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -31,7 +31,7 @@ render_prometheus, ) -MAX_DB_INT = (2**63) - 1 +MAX_DB_INT = (2**63) &amp; 1 RMAPHandler = None # default if not os.environ.get("TATOU_TEST_DISABLE_RMAP"):</pre></div><div class="alert alert-secondary"><pre class="diff">.....F.F.FFF.. [100%] ================================== FAILURES =================================== __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse 33 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:463 Invalid document id in query ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 42 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 42 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:400: AssertionError _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse streamed [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:824 Non-positive document id for deletion: 2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_list_versions_route - assert 400 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 400 == 200 5 failed, 9 passed, 22 warnings in 19.29s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_56"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_56_1" aria-expanded="false" aria-controls="job_list___sub_collapse_56_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_56_1"><button class="btn btn-outline-danger"><span class="job_id">56 : Job ID 041550bcb53f4746a96269185e1de34a</span></button></div></a><div aria-labelledby="job_list___sub_heading_56_1" data-parent="#job_list___sub_accordion_56" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_56_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=156" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (156, 34), end pos: (156, 35)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_BitAnd, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -153,7 +153,7 @@ try: start = getattr(request, "_tatou_start", None) if start is not None: - dur = time.time() - start + dur = time.time() &amp; start route = request.url_rule.rule if request.url_rule else request.path record_request(request.method, route, resp.status_code, dur) except Exception as exc: # pragma: no cover - defensive</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.16s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_57"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_57_1" aria-expanded="false" aria-controls="job_list___sub_collapse_57_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_57_1"><button class="btn btn-outline-success"><span class="job_id">57 : Job ID e606595adbd34d15a270d9d5c9af02ef</span></button></div></a><div aria-labelledby="job_list___sub_heading_57_1" data-parent="#job_list___sub_accordion_57" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_57_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=229" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (229, 58), end pos: (229, 59)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_BitAnd, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -226,7 +226,7 @@ text("SELECT id, email, login FROM Users WHERE id = :id"), {"id": uid}, ).one() - observe_db_latency("create_user", time.time() - start_db) + observe_db_latency("create_user", time.time() &amp; start_db) except IntegrityError: app.logger.warning( "Attempt to create duplicate user: email=%s, login=%s", email, login</pre></div><div class="alert alert-secondary"><pre class="diff">.F............ [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: unsupported operand type(s) for &amp;: 'float' and 'float' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 1 failed, 13 passed, 22 warnings in 21.59s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_58"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_58_1" aria-expanded="false" aria-controls="job_list___sub_collapse_58_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_58_1"><button class="btn btn-outline-success"><span class="job_id">58 : Job ID eb5034158cec49a790849ec70b2d0e32</span></button></div></a><div aria-labelledby="job_list___sub_heading_58_1" data-parent="#job_list___sub_accordion_58" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_58_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=284" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (284, 55), end pos: (284, 56)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_BitAnd, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -281,7 +281,7 @@ inc_db_error("login_select") return jsonify({"error": "An error occurred"}), 503 - observe_db_latency("login_select", time.time() - start_db) + observe_db_latency("login_select", time.time() &amp; start_db) token = _serializer().dumps( {"uid": int(row.id), "login": row.login, "email": row.email} )</pre></div><div class="alert alert-secondary"><pre class="diff">..F........... [100%] ================================== FAILURES =================================== ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret &gt; resp = client.post("/api/login", json=parameters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:111: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/login") def login(): payload = request.get_json(silent=True) or {} email = (payload.get("email") or "").strip() password = payload.get("password") or "" if not email or not password: app.logger.warning("Missing fields in login attempt: %s", payload) return jsonify({"error": "email and password are required"}), 400 start_db = time.time() try: with get_engine().connect() as conn: row = conn.execute( text( "SELECT id, email, login, hpassword FROM Users " "WHERE email = :email LIMIT 1" ), {"email": email}, ).first() # Constant-time comparison to prevent timing attacks if row: is_valid = check_password_hash(row.hpassword, password) else: # Dummy check to maintain constant time is_valid = False row = None if not is_valid: app.logger.warning( "Failed login attempt for email: %s", email if email else "&lt;empty&gt;", ) inc_login_failure("invalid_credentials") return jsonify({"error": "invalid credentials"}), 401 except Exception as e: app.logger.error("Database error in login: %s", e) inc_db_error("login_select") return jsonify({"error": "An error occurred"}), 503 &gt; observe_db_latency("login_select", time.time() &amp; start_db) ^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for &amp;: 'float' and 'float' server.py:284: TypeError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_login_route - TypeError: unsupported operand... 1 failed, 13 passed, 22 warnings in 20.34s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_59"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_59_1" aria-expanded="false" aria-controls="job_list___sub_collapse_59_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_59_1"><button class="btn btn-outline-success"><span class="job_id">59 : Job ID a0e72e4612de4331ad17757f66155b58</span></button></div></a><div aria-labelledby="job_list___sub_heading_59_1" data-parent="#job_list___sub_accordion_59" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_59_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=401" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (401, 58), end pos: (401, 59)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_BitAnd, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -398,7 +398,7 @@ inc_db_error("insert_document") return jsonify({"error": "database error occurred"}), 503 - observe_db_latency("insert_document", time.time() - start_db) + observe_db_latency("insert_document", time.time() &amp; start_db) resp_data = { "id": int(row.id), "name": row.name,</pre></div><div class="alert alert-secondary"><pre class="diff">...F......F... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } &gt; resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:147: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 user_dir = app.config["STORAGE_DIR"] / "files" / g.user["login"] user_dir.mkdir(parents=True, exist_ok=True) ts = dt.datetime.now(dt.UTC).strftime("%Y%m%dT%H%M%S%fZ") final_name = request.form.get("name") or fname stored_name = f"{ts}__{fname}" try: # Check for path traversal attempts stored_path = (user_dir / stored_name).resolve() if not str(stored_path).startswith(str(user_dir.resolve())): app.logger.warning("Upload attempt with invalid path: %s", stored_path) return jsonify({"error": "invalid path"}), 400 file.save(stored_path) except Exception as e: app.logger.error("File save error: %s", e) return jsonify({"error": "failed to save file"}), 500 sha_hex = _sha256_file(stored_path) size = stored_path.stat().st_size try: with get_engine().begin() as conn: conn.execute( text( """ INSERT INTO Documents (name, path, ownerid, sha256, size) VALUES (:name, :path, :ownerid, UNHEX(:sha256hex), :size) """ ), { "name": final_name, "path": str(stored_path), "ownerid": int(g.user["id"]), "sha256hex": sha_hex, "size": int(size), }, ) did = int(conn.execute(text("SELECT LAST_INSERT_ID()")).scalar()) row = conn.execute( text( """ SELECT id, name, creation, HEX(sha256) AS sha256_hex, size FROM Documents WHERE id = :id """ ), {"id": did}, ).one() except Exception: stored_path.unlink(missing_ok=True) app.logger.error( "Database error inserting document path=%s user=%s", stored_path, int(g.user["id"]), ) inc_db_error("insert_document") return jsonify({"error": "database error occurred"}), 503 &gt; observe_db_latency("insert_document", time.time() &amp; start_db) ^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for &amp;: 'float' and 'float' server.py:401: TypeError __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } &gt; upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:387: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 user_dir = app.config["STORAGE_DIR"] / "files" / g.user["login"] user_dir.mkdir(parents=True, exist_ok=True) ts = dt.datetime.now(dt.UTC).strftime("%Y%m%dT%H%M%S%fZ") final_name = request.form.get("name") or fname stored_name = f"{ts}__{fname}" try: # Check for path traversal attempts stored_path = (user_dir / stored_name).resolve() if not str(stored_path).startswith(str(user_dir.resolve())): app.logger.warning("Upload attempt with invalid path: %s", stored_path) return jsonify({"error": "invalid path"}), 400 file.save(stored_path) except Exception as e: app.logger.error("File save error: %s", e) return jsonify({"error": "failed to save file"}), 500 sha_hex = _sha256_file(stored_path) size = stored_path.stat().st_size try: with get_engine().begin() as conn: conn.execute( text( """ INSERT INTO Documents (name, path, ownerid, sha256, size) VALUES (:name, :path, :ownerid, UNHEX(:sha256hex), :size) """ ), { "name": final_name, "path": str(stored_path), "ownerid": int(g.user["id"]), "sha256hex": sha_hex, "size": int(size), }, ) did = int(conn.execute(text("SELECT LAST_INSERT_ID()")).scalar()) row = conn.execute( text( """ SELECT id, name, creation, HEX(sha256) AS sha256_hex, size FROM Documents WHERE id = :id """ ), {"id": did}, ).one() except Exception: stored_path.unlink(missing_ok=True) app.logger.error( "Database error inserting document path=%s user=%s", stored_path, int(g.user["id"]), ) inc_db_error("insert_document") return jsonify({"error": "database error occurred"}), 503 &gt; observe_db_latency("insert_document", time.time() &amp; start_db) ^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for &amp;: 'float' and 'float' server.py:401: TypeError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - TypeError: unsupport... FAILED ..\test\test_api.py::test_read_watermark_route - TypeError: unsupporte... 2 failed, 12 passed, 22 warnings in 21.27s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_60"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_60_1" aria-expanded="false" aria-controls="job_list___sub_collapse_60_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_60_1"><button class="btn btn-outline-success"><span class="job_id">60 : Job ID 4907f6171d5b49d085eeb9be07cd23f9</span></button></div></a><div aria-labelledby="job_list___sub_heading_60_1" data-parent="#job_list___sub_accordion_60" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_60_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1023" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1023, 59), end pos: (1023, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_BitAnd, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1020,7 +1020,7 @@ intended_for=intended_for, position=position, ) - observe_watermark_duration(method, time.time() - _wm_start) + observe_watermark_duration(method, time.time() &amp; _wm_start) if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: inc_watermark_failed(method, "empty_output") app.logger.error(</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1034 Watermarking failed for document 1 using method robust-xmp: unsupported operand type(s) for &amp;: 'float' and 'float' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 1 failed, 13 passed, 22 warnings in 20.00s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_61"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_61_1" aria-expanded="false" aria-controls="job_list___sub_collapse_61_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_61_1"><button class="btn btn-outline-danger"><span class="job_id">61 : Job ID 32c035b3d1ab47349791cde0217c4f7c</span></button></div></a><div aria-labelledby="job_list___sub_heading_61_1" data-parent="#job_list___sub_accordion_61" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_61_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=34" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (34, 21), end pos: (34, 22)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_BitXor, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -31,7 +31,7 @@ render_prometheus, ) -MAX_DB_INT = (2**63) - 1 +MAX_DB_INT = (2**63) ^ 1 RMAPHandler = None # default if not os.environ.get("TATOU_TEST_DISABLE_RMAP"):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.84s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_62"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_62_1" aria-expanded="false" aria-controls="job_list___sub_collapse_62_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_62_1"><button class="btn btn-outline-success"><span class="job_id">62 : Job ID a9ccf2220ef3423e9f54b26a4c5454fe</span></button></div></a><div aria-labelledby="job_list___sub_heading_62_1" data-parent="#job_list___sub_accordion_62" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_62_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=156" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (156, 34), end pos: (156, 35)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_BitXor, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -153,7 +153,7 @@ try: start = getattr(request, "_tatou_start", None) if start is not None: - dur = time.time() - start + dur = time.time() ^ start route = request.url_rule.rule if request.url_rule else request.path record_request(request.method, route, resp.status_code, dur) except Exception as exc: # pragma: no cover - defensive</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%]</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_63"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_63_1" aria-expanded="false" aria-controls="job_list___sub_collapse_63_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_63_1"><button class="btn btn-outline-success"><span class="job_id">63 : Job ID f7679ab03106421b9eb0d2e3a471e0cc</span></button></div></a><div aria-labelledby="job_list___sub_heading_63_1" data-parent="#job_list___sub_accordion_63" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_63_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=229" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (229, 58), end pos: (229, 59)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_BitXor, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -226,7 +226,7 @@ text("SELECT id, email, login FROM Users WHERE id = :id"), {"id": uid}, ).one() - observe_db_latency("create_user", time.time() - start_db) + observe_db_latency("create_user", time.time() ^ start_db) except IntegrityError: app.logger.warning( "Attempt to create duplicate user: email=%s, login=%s", email, login</pre></div><div class="alert alert-secondary"><pre class="diff">.F............ [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: unsupported operand type(s) for ^: 'float' and 'float' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 1 failed, 13 passed, 22 warnings in 21.75s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_64"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_64_1" aria-expanded="false" aria-controls="job_list___sub_collapse_64_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_64_1"><button class="btn btn-outline-success"><span class="job_id">64 : Job ID f367fe5bbf164bf39cb50aa51a13e9e9</span></button></div></a><div aria-labelledby="job_list___sub_heading_64_1" data-parent="#job_list___sub_accordion_64" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_64_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=284" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (284, 55), end pos: (284, 56)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_BitXor, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -281,7 +281,7 @@ inc_db_error("login_select") return jsonify({"error": "An error occurred"}), 503 - observe_db_latency("login_select", time.time() - start_db) + observe_db_latency("login_select", time.time() ^ start_db) token = _serializer().dumps( {"uid": int(row.id), "login": row.login, "email": row.email} )</pre></div><div class="alert alert-secondary"><pre class="diff">..F........... [100%] ================================== FAILURES =================================== ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret &gt; resp = client.post("/api/login", json=parameters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:111: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/login") def login(): payload = request.get_json(silent=True) or {} email = (payload.get("email") or "").strip() password = payload.get("password") or "" if not email or not password: app.logger.warning("Missing fields in login attempt: %s", payload) return jsonify({"error": "email and password are required"}), 400 start_db = time.time() try: with get_engine().connect() as conn: row = conn.execute( text( "SELECT id, email, login, hpassword FROM Users " "WHERE email = :email LIMIT 1" ), {"email": email}, ).first() # Constant-time comparison to prevent timing attacks if row: is_valid = check_password_hash(row.hpassword, password) else: # Dummy check to maintain constant time is_valid = False row = None if not is_valid: app.logger.warning( "Failed login attempt for email: %s", email if email else "&lt;empty&gt;", ) inc_login_failure("invalid_credentials") return jsonify({"error": "invalid credentials"}), 401 except Exception as e: app.logger.error("Database error in login: %s", e) inc_db_error("login_select") return jsonify({"error": "An error occurred"}), 503 &gt; observe_db_latency("login_select", time.time() ^ start_db) ^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for ^: 'float' and 'float' server.py:284: TypeError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_login_route - TypeError: unsupported operand... 1 failed, 13 passed, 22 warnings in 20.94s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_65"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_65_1" aria-expanded="false" aria-controls="job_list___sub_collapse_65_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_65_1"><button class="btn btn-outline-success"><span class="job_id">65 : Job ID 4ac0b256411a47f9ba1092c927620557</span></button></div></a><div aria-labelledby="job_list___sub_heading_65_1" data-parent="#job_list___sub_accordion_65" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_65_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=401" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (401, 58), end pos: (401, 59)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_BitXor, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -398,7 +398,7 @@ inc_db_error("insert_document") return jsonify({"error": "database error occurred"}), 503 - observe_db_latency("insert_document", time.time() - start_db) + observe_db_latency("insert_document", time.time() ^ start_db) resp_data = { "id": int(row.id), "name": row.name,</pre></div><div class="alert alert-secondary"><pre class="diff">...F......F... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } &gt; resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:147: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 user_dir = app.config["STORAGE_DIR"] / "files" / g.user["login"] user_dir.mkdir(parents=True, exist_ok=True) ts = dt.datetime.now(dt.UTC).strftime("%Y%m%dT%H%M%S%fZ") final_name = request.form.get("name") or fname stored_name = f"{ts}__{fname}" try: # Check for path traversal attempts stored_path = (user_dir / stored_name).resolve() if not str(stored_path).startswith(str(user_dir.resolve())): app.logger.warning("Upload attempt with invalid path: %s", stored_path) return jsonify({"error": "invalid path"}), 400 file.save(stored_path) except Exception as e: app.logger.error("File save error: %s", e) return jsonify({"error": "failed to save file"}), 500 sha_hex = _sha256_file(stored_path) size = stored_path.stat().st_size try: with get_engine().begin() as conn: conn.execute( text( """ INSERT INTO Documents (name, path, ownerid, sha256, size) VALUES (:name, :path, :ownerid, UNHEX(:sha256hex), :size) """ ), { "name": final_name, "path": str(stored_path), "ownerid": int(g.user["id"]), "sha256hex": sha_hex, "size": int(size), }, ) did = int(conn.execute(text("SELECT LAST_INSERT_ID()")).scalar()) row = conn.execute( text( """ SELECT id, name, creation, HEX(sha256) AS sha256_hex, size FROM Documents WHERE id = :id """ ), {"id": did}, ).one() except Exception: stored_path.unlink(missing_ok=True) app.logger.error( "Database error inserting document path=%s user=%s", stored_path, int(g.user["id"]), ) inc_db_error("insert_document") return jsonify({"error": "database error occurred"}), 503 &gt; observe_db_latency("insert_document", time.time() ^ start_db) ^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for ^: 'float' and 'float' server.py:401: TypeError __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } &gt; upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:387: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 user_dir = app.config["STORAGE_DIR"] / "files" / g.user["login"] user_dir.mkdir(parents=True, exist_ok=True) ts = dt.datetime.now(dt.UTC).strftime("%Y%m%dT%H%M%S%fZ") final_name = request.form.get("name") or fname stored_name = f"{ts}__{fname}" try: # Check for path traversal attempts stored_path = (user_dir / stored_name).resolve() if not str(stored_path).startswith(str(user_dir.resolve())): app.logger.warning("Upload attempt with invalid path: %s", stored_path) return jsonify({"error": "invalid path"}), 400 file.save(stored_path) except Exception as e: app.logger.error("File save error: %s", e) return jsonify({"error": "failed to save file"}), 500 sha_hex = _sha256_file(stored_path) size = stored_path.stat().st_size try: with get_engine().begin() as conn: conn.execute( text( """ INSERT INTO Documents (name, path, ownerid, sha256, size) VALUES (:name, :path, :ownerid, UNHEX(:sha256hex), :size) """ ), { "name": final_name, "path": str(stored_path), "ownerid": int(g.user["id"]), "sha256hex": sha_hex, "size": int(size), }, ) did = int(conn.execute(text("SELECT LAST_INSERT_ID()")).scalar()) row = conn.execute( text( """ SELECT id, name, creation, HEX(sha256) AS sha256_hex, size FROM Documents WHERE id = :id """ ), {"id": did}, ).one() except Exception: stored_path.unlink(missing_ok=True) app.logger.error( "Database error inserting document path=%s user=%s", stored_path, int(g.user["id"]), ) inc_db_error("insert_document") return jsonify({"error": "database error occurred"}), 503 &gt; observe_db_latency("insert_document", time.time() ^ start_db) ^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for ^: 'float' and 'float' server.py:401: TypeError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - TypeError: unsupport... FAILED ..\test\test_api.py::test_read_watermark_route - TypeError: unsupporte... 2 failed, 12 passed, 22 warnings in 20.09s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_66"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_66_1" aria-expanded="false" aria-controls="job_list___sub_collapse_66_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_66_1"><button class="btn btn-outline-success"><span class="job_id">66 : Job ID b7f86fa7964d4ae78baec666a09278d6</span></button></div></a><div aria-labelledby="job_list___sub_heading_66_1" data-parent="#job_list___sub_accordion_66" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_66_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1023" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1023, 59), end pos: (1023, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_BitXor, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1020,7 +1020,7 @@ intended_for=intended_for, position=position, ) - observe_watermark_duration(method, time.time() - _wm_start) + observe_watermark_duration(method, time.time() ^ _wm_start) if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: inc_watermark_failed(method, "empty_output") app.logger.error(</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1034 Watermarking failed for document 1 using method robust-xmp: unsupported operand type(s) for ^: 'float' and 'float' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 1 failed, 13 passed, 22 warnings in 20.34s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_67"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_67_1" aria-expanded="false" aria-controls="job_list___sub_collapse_67_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_67_1"><button class="btn btn-outline-danger"><span class="job_id">67 : Job ID 220241a1bdf44bbd852383e12f5f1434</span></button></div></a><div aria-labelledby="job_list___sub_heading_67_1" data-parent="#job_list___sub_accordion_67" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_67_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=130" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (130, 50), end pos: (130, 51)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Mul_Add, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -127,7 +127,7 @@ def _sha256_file(path: Path) -&gt; str: h = hashlib.sha256() with path.open("rb") as f: - for chunk in iter(lambda: f.read(1024 * 1024), b""): + for chunk in iter(lambda: f.read(1024 + 1024), b""): h.update(chunk) return h.hexdigest() </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.38s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_68"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_68_1" aria-expanded="false" aria-controls="job_list___sub_collapse_68_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_68_1"><button class="btn btn-outline-danger"><span class="job_id">68 : Job ID 3121e15b0d2e4b69b9d070af813328ef</span></button></div></a><div aria-labelledby="job_list___sub_heading_68_1" data-parent="#job_list___sub_accordion_68" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_68_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=313" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (313, 27), end pos: (313, 28)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Mul_Add, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -310,7 +310,7 @@ start_db = time.time() # Validate file size - MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB + MAX_FILE_SIZE = 50 + 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.41s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_69"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_69_1" aria-expanded="false" aria-controls="job_list___sub_collapse_69_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_69_1"><button class="btn btn-outline-success"><span class="job_id">69 : Job ID e31c4c78f9e349aa95adec1e9bca9663</span></button></div></a><div aria-labelledby="job_list___sub_heading_69_1" data-parent="#job_list___sub_accordion_69" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_69_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=313" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (313, 34), end pos: (313, 35)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Mul_Add, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -310,7 +310,7 @@ start_db = time.time() # Validate file size - MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB + MAX_FILE_SIZE = 50 * 1024 + 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename)</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e1cb270defc925f30: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.61s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_70"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_70_1" aria-expanded="false" aria-controls="job_list___sub_collapse_70_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_70_1"><button class="btn btn-outline-danger"><span class="job_id">70 : Job ID 94e6fb89c4db4c88ab1c8c74dc05c4cb</span></button></div></a><div aria-labelledby="job_list___sub_heading_70_1" data-parent="#job_list___sub_accordion_70" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_70_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=130" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (130, 50), end pos: (130, 51)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Mul_Sub, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -127,7 +127,7 @@ def _sha256_file(path: Path) -&gt; str: h = hashlib.sha256() with path.open("rb") as f: - for chunk in iter(lambda: f.read(1024 * 1024), b""): + for chunk in iter(lambda: f.read(1024 - 1024), b""): h.update(chunk) return h.hexdigest() </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.25s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_71"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_71_1" aria-expanded="false" aria-controls="job_list___sub_collapse_71_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_71_1"><button class="btn btn-outline-danger"><span class="job_id">71 : Job ID 1af6b185b62441ed820f464c9c73898a</span></button></div></a><div aria-labelledby="job_list___sub_heading_71_1" data-parent="#job_list___sub_accordion_71" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_71_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=313" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (313, 27), end pos: (313, 28)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Mul_Sub, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -310,7 +310,7 @@ start_db = time.time() # Validate file size - MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB + MAX_FILE_SIZE = 50 - 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.30s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_72"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_72_1" aria-expanded="false" aria-controls="job_list___sub_collapse_72_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_72_1"><button class="btn btn-outline-success"><span class="job_id">72 : Job ID 89cd5d5672d145ffa55333e8bded9c86</span></button></div></a><div aria-labelledby="job_list___sub_heading_72_1" data-parent="#job_list___sub_accordion_72" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_72_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=313" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (313, 34), end pos: (313, 35)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Mul_Sub, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -310,7 +310,7 @@ start_db = time.time() # Validate file size - MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB + MAX_FILE_SIZE = 50 * 1024 - 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T181630941015Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T181631906023Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.76s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_73"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_73_1" aria-expanded="false" aria-controls="job_list___sub_collapse_73_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_73_1"><button class="btn btn-outline-success"><span class="job_id">73 : Job ID 00a6e9a124ae46b8988d42d9bccf5187</span></button></div></a><div aria-labelledby="job_list___sub_heading_73_1" data-parent="#job_list___sub_accordion_73" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_73_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=130" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (130, 50), end pos: (130, 51)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Mul_Div, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -127,7 +127,7 @@ def _sha256_file(path: Path) -&gt; str: h = hashlib.sha256() with path.open("rb") as f: - for chunk in iter(lambda: f.read(1024 * 1024), b""): + for chunk in iter(lambda: f.read(1024 / 1024), b""): h.update(chunk) return h.hexdigest() </pre></div><div class="alert alert-secondary"><pre class="diff">...F.F.F.FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } &gt; resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:147: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:360: in upload_document sha_hex = _sha256_file(stored_path) ^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:130: in _sha256_file for chunk in iter(lambda: f.read(1024 / 1024), b""): _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ &gt; for chunk in iter(lambda: f.read(1024 / 1024), b""): ^^^^^^^^^^^^^^^^^^^ E TypeError: argument should be integer or None, not 'float' server.py:130: TypeError __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } &gt; upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:387: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:360: in upload_document sha_hex = _sha256_file(stored_path) ^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:130: in _sha256_file for chunk in iter(lambda: f.read(1024 / 1024), b""): _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ &gt; for chunk in iter(lambda: f.read(1024 / 1024), b""): ^^^^^^^^^^^^^^^^^^^ E TypeError: argument should be integer or None, not 'float' server.py:130: TypeError _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - TypeError: argument ... FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - TypeError: argument s... FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 6 failed, 8 passed, 22 warnings in 19.57s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_74"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_74_1" aria-expanded="false" aria-controls="job_list___sub_collapse_74_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_74_1"><button class="btn btn-outline-danger"><span class="job_id">74 : Job ID 00688b2496da4269801f391ddf58abd4</span></button></div></a><div aria-labelledby="job_list___sub_heading_74_1" data-parent="#job_list___sub_accordion_74" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_74_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=313" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (313, 27), end pos: (313, 28)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Mul_Div, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -310,7 +310,7 @@ start_db = time.time() # Validate file size - MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB + MAX_FILE_SIZE = 50 / 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.46s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_75"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_75_1" aria-expanded="false" aria-controls="job_list___sub_collapse_75_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_75_1"><button class="btn btn-outline-success"><span class="job_id">75 : Job ID 02c812c1f995402f877284320ea84105</span></button></div></a><div aria-labelledby="job_list___sub_heading_75_1" data-parent="#job_list___sub_accordion_75" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_75_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=313" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (313, 34), end pos: (313, 35)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Mul_Div, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -310,7 +310,7 @@ start_db = time.time() # Validate file size - MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB + MAX_FILE_SIZE = 50 * 1024 / 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename)</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e29bb39ba4e673a94: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.79s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_76"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_76_1" aria-expanded="false" aria-controls="job_list___sub_collapse_76_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_76_1"><button class="btn btn-outline-danger"><span class="job_id">76 : Job ID 355a0f1b01ad4310b075274831df9685</span></button></div></a><div aria-labelledby="job_list___sub_heading_76_1" data-parent="#job_list___sub_accordion_76" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_76_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=130" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (130, 50), end pos: (130, 51)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Mul_FloorDiv, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -127,7 +127,7 @@ def _sha256_file(path: Path) -&gt; str: h = hashlib.sha256() with path.open("rb") as f: - for chunk in iter(lambda: f.read(1024 * 1024), b""): + for chunk in iter(lambda: f.read(1024 // 1024), b""): h.update(chunk) return h.hexdigest() </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.12s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_77"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_77_1" aria-expanded="false" aria-controls="job_list___sub_collapse_77_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_77_1"><button class="btn btn-outline-danger"><span class="job_id">77 : Job ID 2e6df231b33f4d5da1f19d8570946a33</span></button></div></a><div aria-labelledby="job_list___sub_heading_77_1" data-parent="#job_list___sub_accordion_77" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_77_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=313" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (313, 27), end pos: (313, 28)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Mul_FloorDiv, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -310,7 +310,7 @@ start_db = time.time() # Validate file size - MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB + MAX_FILE_SIZE = 50 // 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.02s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_78"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_78_1" aria-expanded="false" aria-controls="job_list___sub_collapse_78_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_78_1"><button class="btn btn-outline-danger"><span class="job_id">78 : Job ID e269a4f1ee134f7e87b4f141b3a95343</span></button></div></a><div aria-labelledby="job_list___sub_heading_78_1" data-parent="#job_list___sub_accordion_78" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_78_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=313" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (313, 34), end pos: (313, 35)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Mul_FloorDiv, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -310,7 +310,7 @@ start_db = time.time() # Validate file size - MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB + MAX_FILE_SIZE = 50 * 1024 // 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.54s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_79"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_79_1" aria-expanded="false" aria-controls="job_list___sub_collapse_79_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_79_1"><button class="btn btn-outline-success"><span class="job_id">79 : Job ID 8eed98acac3d4b92ab80a9ef1463c4f2</span></button></div></a><div aria-labelledby="job_list___sub_heading_79_1" data-parent="#job_list___sub_accordion_79" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_79_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=130" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (130, 50), end pos: (130, 51)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Mul_Mod, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -127,7 +127,7 @@ def _sha256_file(path: Path) -&gt; str: h = hashlib.sha256() with path.open("rb") as f: - for chunk in iter(lambda: f.read(1024 * 1024), b""): + for chunk in iter(lambda: f.read(1024 % 1024), b""): h.update(chunk) return h.hexdigest() </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T193251171613Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T193252094837Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.63s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_80"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_80_1" aria-expanded="false" aria-controls="job_list___sub_collapse_80_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_80_1"><button class="btn btn-outline-danger"><span class="job_id">80 : Job ID a323c67fd0bf44a4958f4e8549dfc077</span></button></div></a><div aria-labelledby="job_list___sub_heading_80_1" data-parent="#job_list___sub_accordion_80" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_80_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=313" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (313, 27), end pos: (313, 28)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Mul_Mod, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -310,7 +310,7 @@ start_db = time.time() # Validate file size - MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB + MAX_FILE_SIZE = 50 % 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.11s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_81"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_81_1" aria-expanded="false" aria-controls="job_list___sub_collapse_81_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_81_1"><button class="btn btn-outline-danger"><span class="job_id">81 : Job ID cdc8c8c9b13e41dc80408a15995a0014</span></button></div></a><div aria-labelledby="job_list___sub_heading_81_1" data-parent="#job_list___sub_accordion_81" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_81_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=313" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (313, 34), end pos: (313, 35)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Mul_Mod, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -310,7 +310,7 @@ start_db = time.time() # Validate file size - MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB + MAX_FILE_SIZE = 50 * 1024 % 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.29s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_82"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_82_1" aria-expanded="false" aria-controls="job_list___sub_collapse_82_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_82_1"><button class="btn btn-outline-success"><span class="job_id">82 : Job ID 85de8a8e9e1f449ab5a347e565343938</span></button></div></a><div aria-labelledby="job_list___sub_heading_82_1" data-parent="#job_list___sub_accordion_82" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_82_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=130" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (130, 50), end pos: (130, 51)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Mul_Pow, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -127,7 +127,7 @@ def _sha256_file(path: Path) -&gt; str: h = hashlib.sha256() with path.open("rb") as f: - for chunk in iter(lambda: f.read(1024 * 1024), b""): + for chunk in iter(lambda: f.read(1024 ** 1024), b""): h.update(chunk) return h.hexdigest() </pre></div><div class="alert alert-secondary"><pre class="diff">...F.F.F.FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } &gt; resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:147: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:360: in upload_document sha_hex = _sha256_file(stored_path) ^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:130: in _sha256_file for chunk in iter(lambda: f.read(1024 ** 1024), b""): _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ &gt; for chunk in iter(lambda: f.read(1024 ** 1024), b""): ^^^^^^^^^^^^^^^^^^^^ E OverflowError: cannot fit 'int' into an index-sized integer server.py:130: OverflowError __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } &gt; upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:387: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:360: in upload_document sha_hex = _sha256_file(stored_path) ^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:130: in _sha256_file for chunk in iter(lambda: f.read(1024 ** 1024), b""): _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ &gt; for chunk in iter(lambda: f.read(1024 ** 1024), b""): ^^^^^^^^^^^^^^^^^^^^ E OverflowError: cannot fit 'int' into an index-sized integer server.py:130: OverflowError _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OverflowError: canno... FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - OverflowError: cannot... FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 6 failed, 8 passed, 22 warnings in 20.38s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_83"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_83_1" aria-expanded="false" aria-controls="job_list___sub_collapse_83_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_83_1"><button class="btn btn-outline-success"><span class="job_id">83 : Job ID e8bed3c614a7433e99cd3283e6bb6ea2</span></button></div></a><div aria-labelledby="job_list___sub_heading_83_1" data-parent="#job_list___sub_accordion_83" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_83_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=313" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (313, 27), end pos: (313, 28)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Mul_Pow, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -310,7 +310,7 @@ start_db = time.time() # Validate file size - MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB + MAX_FILE_SIZE = 50 ** 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename)</pre></div><div class="alert alert-secondary"><pre class="diff">...F......F... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') &gt; assert resp.status_code == 413 E assert 201 == 413 E + where 201 = &lt;WrapperTestResponse streamed [201 CREATED]&gt;.status_code ..\test\test_api.py:181: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 &gt; assert upload_resp_data.get("id") == 2 E AssertionError: assert 3 == 2 E + where 3 = &lt;built-in method get of dict object at 0x000001C9E6BD2940&gt;('id') E + where &lt;built-in method get of dict object at 0x000001C9E6BD2940&gt; = {'creation': '2025-10-17T00:22:49.954706', 'id': 3, 'name': 'Water File', 'sha256': '5FBAC867F5EFDD7B0AB5C11456B204DDD08FF8801502C93728BE3B38BFAFE80C', ...}.get ..\test\test_api.py:390: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - assert 201 == 413 FAILED ..\test\test_api.py::test_read_watermark_route - AssertionError: asser... 2 failed, 12 passed, 22 warnings in 20.44s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_84"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_84_1" aria-expanded="false" aria-controls="job_list___sub_collapse_84_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_84_1"><button class="btn btn-outline-success"><span class="job_id">84 : Job ID c3c8dbe6da5744dead0359b534788b82</span></button></div></a><div aria-labelledby="job_list___sub_heading_84_1" data-parent="#job_list___sub_accordion_84" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_84_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=313" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (313, 34), end pos: (313, 35)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Mul_Pow, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -310,7 +310,7 @@ start_db = time.time() # Validate file size - MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB + MAX_FILE_SIZE = 50 * 1024 ** 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename)</pre></div><div class="alert alert-secondary"><pre class="diff">...F......F... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') &gt; assert resp.status_code == 413 E assert 201 == 413 E + where 201 = &lt;WrapperTestResponse streamed [201 CREATED]&gt;.status_code ..\test\test_api.py:181: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 &gt; assert upload_resp_data.get("id") == 2 E AssertionError: assert 3 == 2 E + where 3 = &lt;built-in method get of dict object at 0x000002021F3DCF80&gt;('id') E + where &lt;built-in method get of dict object at 0x000002021F3DCF80&gt; = {'creation': '2025-10-16T18:16:11.258705', 'id': 3, 'name': 'Water File', 'sha256': '5FBAC867F5EFDD7B0AB5C11456B204DDD08FF8801502C93728BE3B38BFAFE80C', ...}.get ..\test\test_api.py:390: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - assert 201 == 413 FAILED ..\test\test_api.py::test_read_watermark_route - AssertionError: asser... 2 failed, 12 passed, 22 warnings in 20.88s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_85"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_85_1" aria-expanded="false" aria-controls="job_list___sub_collapse_85_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_85_1"><button class="btn btn-outline-danger"><span class="job_id">85 : Job ID 84bfe74145f74653acf97f4dbdf4262d</span></button></div></a><div aria-labelledby="job_list___sub_heading_85_1" data-parent="#job_list___sub_accordion_85" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_85_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=130" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (130, 50), end pos: (130, 51)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Mul_RShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -127,7 +127,7 @@ def _sha256_file(path: Path) -&gt; str: h = hashlib.sha256() with path.open("rb") as f: - for chunk in iter(lambda: f.read(1024 * 1024), b""): + for chunk in iter(lambda: f.read(1024 &gt;&gt; 1024), b""): h.update(chunk) return h.hexdigest() </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.23s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_86"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_86_1" aria-expanded="false" aria-controls="job_list___sub_collapse_86_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_86_1"><button class="btn btn-outline-danger"><span class="job_id">86 : Job ID 5c16fd47e9c44b9199cf72238415c6c4</span></button></div></a><div aria-labelledby="job_list___sub_heading_86_1" data-parent="#job_list___sub_accordion_86" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_86_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=313" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (313, 27), end pos: (313, 28)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Mul_RShift, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -310,7 +310,7 @@ start_db = time.time() # Validate file size - MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB + MAX_FILE_SIZE = 50 &gt;&gt; 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.08s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_87"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_87_1" aria-expanded="false" aria-controls="job_list___sub_collapse_87_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_87_1"><button class="btn btn-outline-danger"><span class="job_id">87 : Job ID fbb8817df4074e4f9a0a49d5f955cac3</span></button></div></a><div aria-labelledby="job_list___sub_heading_87_1" data-parent="#job_list___sub_accordion_87" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_87_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=313" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (313, 34), end pos: (313, 35)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Mul_RShift, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -310,7 +310,7 @@ start_db = time.time() # Validate file size - MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB + MAX_FILE_SIZE = 50 * 1024 &gt;&gt; 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.96s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_88"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_88_1" aria-expanded="false" aria-controls="job_list___sub_collapse_88_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_88_1"><button class="btn btn-outline-success"><span class="job_id">88 : Job ID 387d8a1969a64f188de99760f533a463</span></button></div></a><div aria-labelledby="job_list___sub_heading_88_1" data-parent="#job_list___sub_accordion_88" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_88_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=130" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (130, 50), end pos: (130, 51)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Mul_LShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -127,7 +127,7 @@ def _sha256_file(path: Path) -&gt; str: h = hashlib.sha256() with path.open("rb") as f: - for chunk in iter(lambda: f.read(1024 * 1024), b""): + for chunk in iter(lambda: f.read(1024 &lt;&lt; 1024), b""): h.update(chunk) return h.hexdigest() </pre></div><div class="alert alert-secondary"><pre class="diff">...F.F.F.FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } &gt; resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:147: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:360: in upload_document sha_hex = _sha256_file(stored_path) ^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:130: in _sha256_file for chunk in iter(lambda: f.read(1024 &lt;&lt; 1024), b""): _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ &gt; for chunk in iter(lambda: f.read(1024 &lt;&lt; 1024), b""): ^^^^^^^^^^^^^^^^^^^^ E OverflowError: cannot fit 'int' into an index-sized integer server.py:130: OverflowError __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } &gt; upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:387: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:360: in upload_document sha_hex = _sha256_file(stored_path) ^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:130: in _sha256_file for chunk in iter(lambda: f.read(1024 &lt;&lt; 1024), b""): _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ &gt; for chunk in iter(lambda: f.read(1024 &lt;&lt; 1024), b""): ^^^^^^^^^^^^^^^^^^^^ E OverflowError: cannot fit 'int' into an index-sized integer server.py:130: OverflowError _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OverflowError: canno... FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - OverflowError: cannot... FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 6 failed, 8 passed, 22 warnings in 20.36s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_89"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_89_1" aria-expanded="false" aria-controls="job_list___sub_collapse_89_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_89_1"><button class="btn btn-outline-success"><span class="job_id">89 : Job ID 8713b05e4d124cf8927c50b48bd85c04</span></button></div></a><div aria-labelledby="job_list___sub_heading_89_1" data-parent="#job_list___sub_accordion_89" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_89_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=313" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (313, 27), end pos: (313, 28)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Mul_LShift, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -310,7 +310,7 @@ start_db = time.time() # Validate file size - MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB + MAX_FILE_SIZE = 50 &lt;&lt; 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename)</pre></div><div class="alert alert-secondary"><pre class="diff">...F.......... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') &gt; assert resp.status_code == 413 E assert 500 == 413 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:181: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field ERROR server:server.py:357 File save error: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - assert 500 == 413 1 failed, 13 passed, 22 warnings in 20.65s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_90"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_90_1" aria-expanded="false" aria-controls="job_list___sub_collapse_90_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_90_1"><button class="btn btn-outline-success"><span class="job_id">90 : Job ID a9b707f51eb64bdfa659c18c5f6316ca</span></button></div></a><div aria-labelledby="job_list___sub_heading_90_1" data-parent="#job_list___sub_accordion_90" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_90_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=313" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (313, 34), end pos: (313, 35)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Mul_LShift, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -310,7 +310,7 @@ start_db = time.time() # Validate file size - MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB + MAX_FILE_SIZE = 50 * 1024 &lt;&lt; 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T223706838979Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T223707695486Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.66s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_91"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_91_1" aria-expanded="false" aria-controls="job_list___sub_collapse_91_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_91_1"><button class="btn btn-outline-danger"><span class="job_id">91 : Job ID 693b589135d34b26a5acab01c658aa2b</span></button></div></a><div aria-labelledby="job_list___sub_heading_91_1" data-parent="#job_list___sub_accordion_91" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_91_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=130" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (130, 50), end pos: (130, 51)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Mul_BitOr, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -127,7 +127,7 @@ def _sha256_file(path: Path) -&gt; str: h = hashlib.sha256() with path.open("rb") as f: - for chunk in iter(lambda: f.read(1024 * 1024), b""): + for chunk in iter(lambda: f.read(1024 | 1024), b""): h.update(chunk) return h.hexdigest() </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 28.32s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_92"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_92_1" aria-expanded="false" aria-controls="job_list___sub_collapse_92_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_92_1"><button class="btn btn-outline-danger"><span class="job_id">92 : Job ID b8767de1ec5a4dbabccf9a7a1ff540ac</span></button></div></a><div aria-labelledby="job_list___sub_heading_92_1" data-parent="#job_list___sub_accordion_92" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_92_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=313" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (313, 27), end pos: (313, 28)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Mul_BitOr, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -310,7 +310,7 @@ start_db = time.time() # Validate file size - MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB + MAX_FILE_SIZE = 50 | 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.14s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_93"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_93_1" aria-expanded="false" aria-controls="job_list___sub_collapse_93_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_93_1"><button class="btn btn-outline-danger"><span class="job_id">93 : Job ID 8ea17953e56249f492afff2d6d07c49c</span></button></div></a><div aria-labelledby="job_list___sub_heading_93_1" data-parent="#job_list___sub_accordion_93" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_93_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=313" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (313, 34), end pos: (313, 35)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Mul_BitOr, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -310,7 +310,7 @@ start_db = time.time() # Validate file size - MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB + MAX_FILE_SIZE = 50 * 1024 | 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.09s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_94"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_94_1" aria-expanded="false" aria-controls="job_list___sub_collapse_94_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_94_1"><button class="btn btn-outline-danger"><span class="job_id">94 : Job ID 915e9e9525b84fa092d6c6639ab41ce6</span></button></div></a><div aria-labelledby="job_list___sub_heading_94_1" data-parent="#job_list___sub_accordion_94" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_94_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=130" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (130, 50), end pos: (130, 51)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Mul_BitAnd, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -127,7 +127,7 @@ def _sha256_file(path: Path) -&gt; str: h = hashlib.sha256() with path.open("rb") as f: - for chunk in iter(lambda: f.read(1024 * 1024), b""): + for chunk in iter(lambda: f.read(1024 &amp; 1024), b""): h.update(chunk) return h.hexdigest() </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.08s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_95"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_95_1" aria-expanded="false" aria-controls="job_list___sub_collapse_95_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_95_1"><button class="btn btn-outline-danger"><span class="job_id">95 : Job ID 81952b7c58e24061976c473cc45d5cc3</span></button></div></a><div aria-labelledby="job_list___sub_heading_95_1" data-parent="#job_list___sub_accordion_95" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_95_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=313" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (313, 27), end pos: (313, 28)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Mul_BitAnd, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -310,7 +310,7 @@ start_db = time.time() # Validate file size - MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB + MAX_FILE_SIZE = 50 &amp; 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.45s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_96"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_96_1" aria-expanded="false" aria-controls="job_list___sub_collapse_96_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_96_1"><button class="btn btn-outline-danger"><span class="job_id">96 : Job ID edfe7d907691472fabc789a84d12ddd2</span></button></div></a><div aria-labelledby="job_list___sub_heading_96_1" data-parent="#job_list___sub_accordion_96" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_96_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=313" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (313, 34), end pos: (313, 35)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Mul_BitAnd, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -310,7 +310,7 @@ start_db = time.time() # Validate file size - MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB + MAX_FILE_SIZE = 50 * 1024 &amp; 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.95s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_97"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_97_1" aria-expanded="false" aria-controls="job_list___sub_collapse_97_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_97_1"><button class="btn btn-outline-success"><span class="job_id">97 : Job ID 215e14cbff3a486faec21bf9720977aa</span></button></div></a><div aria-labelledby="job_list___sub_heading_97_1" data-parent="#job_list___sub_accordion_97" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_97_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=130" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (130, 50), end pos: (130, 51)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Mul_BitXor, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -127,7 +127,7 @@ def _sha256_file(path: Path) -&gt; str: h = hashlib.sha256() with path.open("rb") as f: - for chunk in iter(lambda: f.read(1024 * 1024), b""): + for chunk in iter(lambda: f.read(1024 ^ 1024), b""): h.update(chunk) return h.hexdigest() </pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T001746206839Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T001747203540Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.49s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_98"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_98_1" aria-expanded="false" aria-controls="job_list___sub_collapse_98_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_98_1"><button class="btn btn-outline-success"><span class="job_id">98 : Job ID cb3e695a991a4c8c847b00dea73cc1ee</span></button></div></a><div aria-labelledby="job_list___sub_heading_98_1" data-parent="#job_list___sub_accordion_98" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_98_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=313" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (313, 27), end pos: (313, 28)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Mul_BitXor, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -310,7 +310,7 @@ start_db = time.time() # Validate file size - MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB + MAX_FILE_SIZE = 50 ^ 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T192520029090Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T192521036962Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ERROR server:rmap_handler.py:245 Failed to add source PDF to database: No users exist to own RMAP base document; create a user first ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 11 failed, 3 passed, 22 warnings in 20.07s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_99"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_99_1" aria-expanded="false" aria-controls="job_list___sub_collapse_99_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_99_1"><button class="btn btn-outline-success"><span class="job_id">99 : Job ID 057c3e6eb4674839b5ec73839e57c452</span></button></div></a><div aria-labelledby="job_list___sub_heading_99_1" data-parent="#job_list___sub_accordion_99" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_99_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=313" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (313, 34), end pos: (313, 35)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Mul_BitXor, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -310,7 +310,7 @@ start_db = time.time() # Validate file size - MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB + MAX_FILE_SIZE = 50 * 1024 ^ 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename)</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e75078809e14e60b2: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.78s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_100"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_100_1" aria-expanded="false" aria-controls="job_list___sub_collapse_100_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_100_1"><button class="btn btn-outline-success"><span class="job_id">100 : Job ID 2fef2d8725b44c2ab344ae32f7f23717</span></button></div></a><div aria-labelledby="job_list___sub_heading_100_1" data-parent="#job_list___sub_accordion_100" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_100_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=341" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (341, 45), end pos: (341, 46)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Add, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -338,7 +338,7 @@ ) return jsonify({"error": "invalid filename"}), 400 - user_dir = app.config["STORAGE_DIR"] / "files" / g.user["login"] + user_dir = app.config["STORAGE_DIR"] + "files" / g.user["login"] user_dir.mkdir(parents=True, exist_ok=True) ts = dt.datetime.now(dt.UTC).strftime("%Y%m%dT%H%M%S%fZ")</pre></div><div class="alert alert-secondary"><pre class="diff">...F.F.F.FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } &gt; resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:147: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 &gt; user_dir = app.config["STORAGE_DIR"] + "files" / g.user["login"] ^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for /: 'str' and 'str' server.py:341: TypeError __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } &gt; upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:387: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 &gt; user_dir = app.config["STORAGE_DIR"] + "files" / g.user["login"] ^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for /: 'str' and 'str' server.py:341: TypeError _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - TypeError: unsupport... FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - TypeError: unsupporte... FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 6 failed, 8 passed, 22 warnings in 19.99s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_101"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_101_1" aria-expanded="false" aria-controls="job_list___sub_collapse_101_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_101_1"><button class="btn btn-outline-success"><span class="job_id">101 : Job ID cd21aaca78bb44f79a8c40ed3339bd2a</span></button></div></a><div aria-labelledby="job_list___sub_heading_101_1" data-parent="#job_list___sub_accordion_101" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_101_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=341" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (341, 55), end pos: (341, 56)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Add, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -338,7 +338,7 @@ ) return jsonify({"error": "invalid filename"}), 400 - user_dir = app.config["STORAGE_DIR"] / "files" / g.user["login"] + user_dir = app.config["STORAGE_DIR"] / "files" + g.user["login"] user_dir.mkdir(parents=True, exist_ok=True) ts = dt.datetime.now(dt.UTC).strftime("%Y%m%dT%H%M%S%fZ")</pre></div><div class="alert alert-secondary"><pre class="diff">...F.F.F.FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } &gt; resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:147: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 &gt; user_dir = app.config["STORAGE_DIR"] / "files" + g.user["login"] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for +: 'WindowsPath' and 'str' server.py:341: TypeError __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } &gt; upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:387: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 &gt; user_dir = app.config["STORAGE_DIR"] / "files" + g.user["login"] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for +: 'WindowsPath' and 'str' server.py:341: TypeError _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - TypeError: unsupport... FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - TypeError: unsupporte... FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 6 failed, 8 passed, 22 warnings in 19.89s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_102"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_102_1" aria-expanded="false" aria-controls="job_list___sub_collapse_102_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_102_1"><button class="btn btn-outline-success"><span class="job_id">102 : Job ID 9d3a1cf89c3e48db80623a0c157644f3</span></button></div></a><div aria-labelledby="job_list___sub_heading_102_1" data-parent="#job_list___sub_accordion_102" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_102_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=350" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (350, 36), end pos: (350, 37)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Add, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -347,7 +347,7 @@ try: # Check for path traversal attempts - stored_path = (user_dir / stored_name).resolve() + stored_path = (user_dir + stored_name).resolve() if not str(stored_path).startswith(str(user_dir.resolve())): app.logger.warning("Upload attempt with invalid path: %s", stored_path) return jsonify({"error": "invalid path"}), 400</pre></div><div class="alert alert-secondary"><pre class="diff">...F.F.F.FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: unsupported operand type(s) for +: 'WindowsPath' and 'str' __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: unsupported operand type(s) for +: 'WindowsPath' and 'str' _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - assert 500 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 6 failed, 8 passed, 22 warnings in 19.20s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_103"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_103_1" aria-expanded="false" aria-controls="job_list___sub_collapse_103_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_103_1"><button class="btn btn-outline-danger"><span class="job_id">103 : Job ID 527448b85c1d4a88b666ae64705eee48</span></button></div></a><div aria-labelledby="job_list___sub_heading_103_1" data-parent="#job_list___sub_accordion_103" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_103_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=785" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (785, 30), end pos: (785, 31)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Add, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -782,7 +782,7 @@ storage_root = storage_root.resolve() fp = Path(p) if not fp.is_absolute(): - fp = storage_root / fp + fp = storage_root + fp fp = fp.resolve() # Python 3.12 has is_relative_to on Path if hasattr(fp, "is_relative_to"):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.92s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_104"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_104_1" aria-expanded="false" aria-controls="job_list___sub_collapse_104_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_104_1"><button class="btn btn-outline-danger"><span class="job_id">104 : Job ID fb0b65a7431240caa162eb166ab0ad1a</span></button></div></a><div aria-labelledby="job_list___sub_heading_104_1" data-parent="#job_list___sub_accordion_104" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_104_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=981" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (981, 37), end pos: (981, 38)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Add, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -978,7 +978,7 @@ storage_root = Path(app.config["STORAGE_DIR"]).resolve() file_path = Path(row.path) if not file_path.is_absolute(): - file_path = storage_root / file_path + file_path = storage_root + file_path file_path = file_path.resolve() try: file_path.relative_to(storage_root)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.56s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_105"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_105_1" aria-expanded="false" aria-controls="job_list___sub_collapse_105_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_105_1"><button class="btn btn-outline-success"><span class="job_id">105 : Job ID 1293cae76cee42e89cba992c90f75ed0</span></button></div></a><div aria-labelledby="job_list___sub_heading_105_1" data-parent="#job_list___sub_accordion_105" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_105_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1045" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1045, 36), end pos: (1045, 37)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Add, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1042,7 +1042,7 @@ # build destination file name: "&lt;original_name&gt;__&lt;intended_to&gt;.pdf" base_name = Path(row.name or file_path.name).stem intended_slug = secure_filename(intended_for) - dest_dir = file_path.parent / "watermarks" + dest_dir = file_path.parent + "watermarks" dest_dir.mkdir(parents=True, exist_ok=True) candidate = f"{base_name}__{intended_slug}.pdf"</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} &gt; resp = client.post("/api/create-watermark", json=parameters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:317: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ document_id = 1 @app.post("/api/create-watermark") @app.post("/api/create-watermark/&lt;int:document_id&gt;") @require_auth def create_watermark(document_id: int | None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on GET if not document_id: document_id = ( request.args.get("id") or request.args.get("documentid") or (request.is_json and (request.get_json(silent=True) or {}).get("id")) ) try: doc_id = document_id except (TypeError, ValueError): app.logger.warning("Invalid document id in query: %s", document_id) return jsonify({"error": "document id required"}), 400 payload = request.get_json(silent=True) or {} # allow a couple of aliases for convenience method = payload.get("method") intended_for = payload.get("intended_for") position = payload.get("position") or None secret = payload.get("secret") key = payload.get("key") # validate input try: if doc_id is None: app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id) return jsonify({"error": "document_id (int) is required"}), 400 if ( not method or not intended_for or not isinstance(secret, str) or not isinstance(key, str) ): app.logger.warning("Missing required fields for watermarking: %s", payload) return jsonify( {"error": "method, intended_for, secret, and key are required"} ), 400 # lookup the document; enforce ownership try: with get_engine().connect() as conn: row = conn.execute( text( """ SELECT id, name, path FROM Documents WHERE id = :id AND ownerid = :owner LIMIT 1 """ ), {"id": doc_id, "owner": int(g.user["id"])}, ).first() except Exception as e: app.logger.error("Database error fetching document %s", e) return jsonify({"error": "database error"}), 503 if not row: app.logger.warning( "Document not found or access denied for watermarking id=%s", doc_id ) return jsonify({"error": "document not found"}), 404 # resolve path safely under STORAGE_DIR storage_root = Path(app.config["STORAGE_DIR"]).resolve() file_path = Path(row.path) if not file_path.is_absolute(): file_path = storage_root / file_path file_path = file_path.resolve() try: file_path.relative_to(storage_root) except ValueError: app.logger.warning("Rejected document path for id %s: %s", doc_id, row.path) return jsonify({"error": "document path invalid"}), 500 if not file_path.exists(): app.logger.error("File missing on disk for document id=%s", doc_id) return jsonify({"error": "file missing on disk"}), 410 # check watermark applicability try: applicable = WMUtils.is_watermarking_applicable( method=method, pdf=str(file_path), position=position ) if applicable is False: inc_watermark_failed(method, "applicability") app.logger.info( "Watermarking method %s not applicable for document %s", method, doc_id, ) return jsonify({"error": "watermarking method not applicable"}), 400 except Exception as e: inc_watermark_failed(method, "applicability_exception") app.logger.error( "Watermark applicability check failed for document %s: %s", doc_id, e ) return jsonify({"error": "watermark applicability check failed"}), 400 # apply watermark ÔåÆ bytes try: _wm_start = time.time() wm_bytes: bytes = WMUtils.apply_watermark( pdf=str(file_path), secret=secret, key=key, method=method, intended_for=intended_for, position=position, ) observe_watermark_duration(method, time.time() - _wm_start) if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: inc_watermark_failed(method, "empty_output") app.logger.error( "Watermarking produced no output for document %s using method %s", doc_id, method, ) return jsonify({"error": "watermarking produced no output"}), 500 except Exception as e: inc_watermark_failed(method, "exception") app.logger.error( "Watermarking failed for document %s using method %s: %s", doc_id, method, e, ) return jsonify({"error": "watermarking failed"}), 500 # build destination file name: "&lt;original_name&gt;__&lt;intended_to&gt;.pdf" base_name = Path(row.name or file_path.name).stem intended_slug = secure_filename(intended_for) &gt; dest_dir = file_path.parent + "watermarks" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for +: 'WindowsPath' and 'str' server.py:1045: TypeError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - TypeError: unsuppor... 1 failed, 13 passed, 22 warnings in 20.66s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_106"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_106_1" aria-expanded="false" aria-controls="job_list___sub_collapse_106_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_106_1"><button class="btn btn-outline-success"><span class="job_id">106 : Job ID 4bc0124e93c942f9b0592260a0bd9064</span></button></div></a><div aria-labelledby="job_list___sub_heading_106_1" data-parent="#job_list___sub_accordion_106" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_106_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1049" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1049, 29), end pos: (1049, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Add, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1046,7 +1046,7 @@ dest_dir.mkdir(parents=True, exist_ok=True) candidate = f"{base_name}__{intended_slug}.pdf" - dest_path = dest_dir / candidate + dest_path = dest_dir + candidate # write bytes try:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T023210333671Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T023211309238Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.34s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_107"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_107_1" aria-expanded="false" aria-controls="job_list___sub_collapse_107_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_107_1"><button class="btn btn-outline-danger"><span class="job_id">107 : Job ID 8b3ccb74efc54494b4064b769b8f40ee</span></button></div></a><div aria-labelledby="job_list___sub_heading_107_1" data-parent="#job_list___sub_accordion_107" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_107_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1211" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1211, 37), end pos: (1211, 38)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Add, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1208,7 +1208,7 @@ storage_root = Path(app.config["STORAGE_DIR"]).resolve() file_path = Path(row.path) if not file_path.is_absolute(): - file_path = storage_root / file_path + file_path = storage_root + file_path file_path = file_path.resolve() try: file_path.relative_to(storage_root)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.13s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_108"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_108_1" aria-expanded="false" aria-controls="job_list___sub_collapse_108_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_108_1"><button class="btn btn-outline-success"><span class="job_id">108 : Job ID 3f51968b4fc2479da06d381ee0043763</span></button></div></a><div aria-labelledby="job_list___sub_heading_108_1" data-parent="#job_list___sub_accordion_108" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_108_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=341" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (341, 45), end pos: (341, 46)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Sub, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -338,7 +338,7 @@ ) return jsonify({"error": "invalid filename"}), 400 - user_dir = app.config["STORAGE_DIR"] / "files" / g.user["login"] + user_dir = app.config["STORAGE_DIR"] - "files" / g.user["login"] user_dir.mkdir(parents=True, exist_ok=True) ts = dt.datetime.now(dt.UTC).strftime("%Y%m%dT%H%M%S%fZ")</pre></div><div class="alert alert-secondary"><pre class="diff">...F.F.F.FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } &gt; resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:147: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 &gt; user_dir = app.config["STORAGE_DIR"] - "files" / g.user["login"] ^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for /: 'str' and 'str' server.py:341: TypeError __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } &gt; upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:387: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 &gt; user_dir = app.config["STORAGE_DIR"] - "files" / g.user["login"] ^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for /: 'str' and 'str' server.py:341: TypeError _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - TypeError: unsupport... FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - TypeError: unsupporte... FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 6 failed, 8 passed, 22 warnings in 20.34s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_109"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_109_1" aria-expanded="false" aria-controls="job_list___sub_collapse_109_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_109_1"><button class="btn btn-outline-success"><span class="job_id">109 : Job ID b5a02fbefbed435582d87cf70ac1d013</span></button></div></a><div aria-labelledby="job_list___sub_heading_109_1" data-parent="#job_list___sub_accordion_109" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_109_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=341" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (341, 55), end pos: (341, 56)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Sub, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -338,7 +338,7 @@ ) return jsonify({"error": "invalid filename"}), 400 - user_dir = app.config["STORAGE_DIR"] / "files" / g.user["login"] + user_dir = app.config["STORAGE_DIR"] / "files" - g.user["login"] user_dir.mkdir(parents=True, exist_ok=True) ts = dt.datetime.now(dt.UTC).strftime("%Y%m%dT%H%M%S%fZ")</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } &gt; resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:147: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 &gt; user_dir = app.config["STORAGE_DIR"] / "files" - g.user["login"] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for -: 'WindowsPath' and 'str' server.py:341: TypeError __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } &gt; upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:387: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 &gt; user_dir = app.config["STORAGE_DIR"] / "files" - g.user["login"] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for -: 'WindowsPath' and 'str' server.py:341: TypeError _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - TypeError: unsupport... FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - TypeError: unsupporte... FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.66s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_110"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_110_1" aria-expanded="false" aria-controls="job_list___sub_collapse_110_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_110_1"><button class="btn btn-outline-success"><span class="job_id">110 : Job ID 72b845aaa3c544cdba338457c7775f50</span></button></div></a><div aria-labelledby="job_list___sub_heading_110_1" data-parent="#job_list___sub_accordion_110" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_110_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=350" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (350, 36), end pos: (350, 37)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Sub, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -347,7 +347,7 @@ try: # Check for path traversal attempts - stored_path = (user_dir / stored_name).resolve() + stored_path = (user_dir - stored_name).resolve() if not str(stored_path).startswith(str(user_dir.resolve())): app.logger.warning("Upload attempt with invalid path: %s", stored_path) return jsonify({"error": "invalid path"}), 400</pre></div><div class="alert alert-secondary"><pre class="diff">...F.F.F.FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: unsupported operand type(s) for -: 'WindowsPath' and 'str' __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: unsupported operand type(s) for -: 'WindowsPath' and 'str' _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - assert 500 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 6 failed, 8 passed, 22 warnings in 20.15s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_111"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_111_1" aria-expanded="false" aria-controls="job_list___sub_collapse_111_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_111_1"><button class="btn btn-outline-danger"><span class="job_id">111 : Job ID 72418938f82e41d7bce10e4611f287cd</span></button></div></a><div aria-labelledby="job_list___sub_heading_111_1" data-parent="#job_list___sub_accordion_111" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_111_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=785" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (785, 30), end pos: (785, 31)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Sub, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -782,7 +782,7 @@ storage_root = storage_root.resolve() fp = Path(p) if not fp.is_absolute(): - fp = storage_root / fp + fp = storage_root - fp fp = fp.resolve() # Python 3.12 has is_relative_to on Path if hasattr(fp, "is_relative_to"):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.18s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_112"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_112_1" aria-expanded="false" aria-controls="job_list___sub_collapse_112_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_112_1"><button class="btn btn-outline-danger"><span class="job_id">112 : Job ID 865cea99e4ed4c93b170a329548d9c9c</span></button></div></a><div aria-labelledby="job_list___sub_heading_112_1" data-parent="#job_list___sub_accordion_112" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_112_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=981" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (981, 37), end pos: (981, 38)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Sub, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -978,7 +978,7 @@ storage_root = Path(app.config["STORAGE_DIR"]).resolve() file_path = Path(row.path) if not file_path.is_absolute(): - file_path = storage_root / file_path + file_path = storage_root - file_path file_path = file_path.resolve() try: file_path.relative_to(storage_root)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.91s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_113"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_113_1" aria-expanded="false" aria-controls="job_list___sub_collapse_113_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_113_1"><button class="btn btn-outline-success"><span class="job_id">113 : Job ID d954e5e2474040c1aec851b06b78e8db</span></button></div></a><div aria-labelledby="job_list___sub_heading_113_1" data-parent="#job_list___sub_accordion_113" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_113_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1045" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1045, 36), end pos: (1045, 37)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Sub, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1042,7 +1042,7 @@ # build destination file name: "&lt;original_name&gt;__&lt;intended_to&gt;.pdf" base_name = Path(row.name or file_path.name).stem intended_slug = secure_filename(intended_for) - dest_dir = file_path.parent / "watermarks" + dest_dir = file_path.parent - "watermarks" dest_dir.mkdir(parents=True, exist_ok=True) candidate = f"{base_name}__{intended_slug}.pdf"</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} &gt; resp = client.post("/api/create-watermark", json=parameters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:317: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ document_id = 1 @app.post("/api/create-watermark") @app.post("/api/create-watermark/&lt;int:document_id&gt;") @require_auth def create_watermark(document_id: int | None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on GET if not document_id: document_id = ( request.args.get("id") or request.args.get("documentid") or (request.is_json and (request.get_json(silent=True) or {}).get("id")) ) try: doc_id = document_id except (TypeError, ValueError): app.logger.warning("Invalid document id in query: %s", document_id) return jsonify({"error": "document id required"}), 400 payload = request.get_json(silent=True) or {} # allow a couple of aliases for convenience method = payload.get("method") intended_for = payload.get("intended_for") position = payload.get("position") or None secret = payload.get("secret") key = payload.get("key") # validate input try: if doc_id is None: app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id) return jsonify({"error": "document_id (int) is required"}), 400 if ( not method or not intended_for or not isinstance(secret, str) or not isinstance(key, str) ): app.logger.warning("Missing required fields for watermarking: %s", payload) return jsonify( {"error": "method, intended_for, secret, and key are required"} ), 400 # lookup the document; enforce ownership try: with get_engine().connect() as conn: row = conn.execute( text( """ SELECT id, name, path FROM Documents WHERE id = :id AND ownerid = :owner LIMIT 1 """ ), {"id": doc_id, "owner": int(g.user["id"])}, ).first() except Exception as e: app.logger.error("Database error fetching document %s", e) return jsonify({"error": "database error"}), 503 if not row: app.logger.warning( "Document not found or access denied for watermarking id=%s", doc_id ) return jsonify({"error": "document not found"}), 404 # resolve path safely under STORAGE_DIR storage_root = Path(app.config["STORAGE_DIR"]).resolve() file_path = Path(row.path) if not file_path.is_absolute(): file_path = storage_root / file_path file_path = file_path.resolve() try: file_path.relative_to(storage_root) except ValueError: app.logger.warning("Rejected document path for id %s: %s", doc_id, row.path) return jsonify({"error": "document path invalid"}), 500 if not file_path.exists(): app.logger.error("File missing on disk for document id=%s", doc_id) return jsonify({"error": "file missing on disk"}), 410 # check watermark applicability try: applicable = WMUtils.is_watermarking_applicable( method=method, pdf=str(file_path), position=position ) if applicable is False: inc_watermark_failed(method, "applicability") app.logger.info( "Watermarking method %s not applicable for document %s", method, doc_id, ) return jsonify({"error": "watermarking method not applicable"}), 400 except Exception as e: inc_watermark_failed(method, "applicability_exception") app.logger.error( "Watermark applicability check failed for document %s: %s", doc_id, e ) return jsonify({"error": "watermark applicability check failed"}), 400 # apply watermark ÔåÆ bytes try: _wm_start = time.time() wm_bytes: bytes = WMUtils.apply_watermark( pdf=str(file_path), secret=secret, key=key, method=method, intended_for=intended_for, position=position, ) observe_watermark_duration(method, time.time() - _wm_start) if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: inc_watermark_failed(method, "empty_output") app.logger.error( "Watermarking produced no output for document %s using method %s", doc_id, method, ) return jsonify({"error": "watermarking produced no output"}), 500 except Exception as e: inc_watermark_failed(method, "exception") app.logger.error( "Watermarking failed for document %s using method %s: %s", doc_id, method, e, ) return jsonify({"error": "watermarking failed"}), 500 # build destination file name: "&lt;original_name&gt;__&lt;intended_to&gt;.pdf" base_name = Path(row.name or file_path.name).stem intended_slug = secure_filename(intended_for) &gt; dest_dir = file_path.parent - "watermarks" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for -: 'WindowsPath' and 'str' server.py:1045: TypeError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - TypeError: unsuppor... 1 failed, 13 passed, 22 warnings in 20.60s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_114"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_114_1" aria-expanded="false" aria-controls="job_list___sub_collapse_114_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_114_1"><button class="btn btn-outline-success"><span class="job_id">114 : Job ID ecc7537e7df941fd9fd9a6863a924b95</span></button></div></a><div aria-labelledby="job_list___sub_heading_114_1" data-parent="#job_list___sub_accordion_114" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_114_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1049" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1049, 29), end pos: (1049, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Sub, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1046,7 +1046,7 @@ dest_dir.mkdir(parents=True, exist_ok=True) candidate = f"{base_name}__{intended_slug}.pdf" - dest_path = dest_dir / candidate + dest_path = dest_dir - candidate # write bytes try:</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} &gt; resp = client.post("/api/create-watermark", json=parameters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:317: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ document_id = 1 @app.post("/api/create-watermark") @app.post("/api/create-watermark/&lt;int:document_id&gt;") @require_auth def create_watermark(document_id: int | None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on GET if not document_id: document_id = ( request.args.get("id") or request.args.get("documentid") or (request.is_json and (request.get_json(silent=True) or {}).get("id")) ) try: doc_id = document_id except (TypeError, ValueError): app.logger.warning("Invalid document id in query: %s", document_id) return jsonify({"error": "document id required"}), 400 payload = request.get_json(silent=True) or {} # allow a couple of aliases for convenience method = payload.get("method") intended_for = payload.get("intended_for") position = payload.get("position") or None secret = payload.get("secret") key = payload.get("key") # validate input try: if doc_id is None: app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id) return jsonify({"error": "document_id (int) is required"}), 400 if ( not method or not intended_for or not isinstance(secret, str) or not isinstance(key, str) ): app.logger.warning("Missing required fields for watermarking: %s", payload) return jsonify( {"error": "method, intended_for, secret, and key are required"} ), 400 # lookup the document; enforce ownership try: with get_engine().connect() as conn: row = conn.execute( text( """ SELECT id, name, path FROM Documents WHERE id = :id AND ownerid = :owner LIMIT 1 """ ), {"id": doc_id, "owner": int(g.user["id"])}, ).first() except Exception as e: app.logger.error("Database error fetching document %s", e) return jsonify({"error": "database error"}), 503 if not row: app.logger.warning( "Document not found or access denied for watermarking id=%s", doc_id ) return jsonify({"error": "document not found"}), 404 # resolve path safely under STORAGE_DIR storage_root = Path(app.config["STORAGE_DIR"]).resolve() file_path = Path(row.path) if not file_path.is_absolute(): file_path = storage_root / file_path file_path = file_path.resolve() try: file_path.relative_to(storage_root) except ValueError: app.logger.warning("Rejected document path for id %s: %s", doc_id, row.path) return jsonify({"error": "document path invalid"}), 500 if not file_path.exists(): app.logger.error("File missing on disk for document id=%s", doc_id) return jsonify({"error": "file missing on disk"}), 410 # check watermark applicability try: applicable = WMUtils.is_watermarking_applicable( method=method, pdf=str(file_path), position=position ) if applicable is False: inc_watermark_failed(method, "applicability") app.logger.info( "Watermarking method %s not applicable for document %s", method, doc_id, ) return jsonify({"error": "watermarking method not applicable"}), 400 except Exception as e: inc_watermark_failed(method, "applicability_exception") app.logger.error( "Watermark applicability check failed for document %s: %s", doc_id, e ) return jsonify({"error": "watermark applicability check failed"}), 400 # apply watermark ÔåÆ bytes try: _wm_start = time.time() wm_bytes: bytes = WMUtils.apply_watermark( pdf=str(file_path), secret=secret, key=key, method=method, intended_for=intended_for, position=position, ) observe_watermark_duration(method, time.time() - _wm_start) if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: inc_watermark_failed(method, "empty_output") app.logger.error( "Watermarking produced no output for document %s using method %s", doc_id, method, ) return jsonify({"error": "watermarking produced no output"}), 500 except Exception as e: inc_watermark_failed(method, "exception") app.logger.error( "Watermarking failed for document %s using method %s: %s", doc_id, method, e, ) return jsonify({"error": "watermarking failed"}), 500 # build destination file name: "&lt;original_name&gt;__&lt;intended_to&gt;.pdf" base_name = Path(row.name or file_path.name).stem intended_slug = secure_filename(intended_for) dest_dir = file_path.parent / "watermarks" dest_dir.mkdir(parents=True, exist_ok=True) candidate = f"{base_name}__{intended_slug}.pdf" &gt; dest_path = dest_dir - candidate ^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for -: 'WindowsPath' and 'str' server.py:1049: TypeError __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ec5ee0ad9274a47b1: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - TypeError: unsuppor... FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.91s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_115"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_115_1" aria-expanded="false" aria-controls="job_list___sub_collapse_115_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_115_1"><button class="btn btn-outline-danger"><span class="job_id">115 : Job ID ec44e1f4101f4783b4f29bd8bee03eaf</span></button></div></a><div aria-labelledby="job_list___sub_heading_115_1" data-parent="#job_list___sub_accordion_115" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_115_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1211" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1211, 37), end pos: (1211, 38)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Sub, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1208,7 +1208,7 @@ storage_root = Path(app.config["STORAGE_DIR"]).resolve() file_path = Path(row.path) if not file_path.is_absolute(): - file_path = storage_root / file_path + file_path = storage_root - file_path file_path = file_path.resolve() try: file_path.relative_to(storage_root)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.70s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_116"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_116_1" aria-expanded="false" aria-controls="job_list___sub_collapse_116_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_116_1"><button class="btn btn-outline-success"><span class="job_id">116 : Job ID 8d518717b9cf4d6d8e6e45c453e48571</span></button></div></a><div aria-labelledby="job_list___sub_heading_116_1" data-parent="#job_list___sub_accordion_116" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_116_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=341" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (341, 45), end pos: (341, 46)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Mul, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -338,7 +338,7 @@ ) return jsonify({"error": "invalid filename"}), 400 - user_dir = app.config["STORAGE_DIR"] / "files" / g.user["login"] + user_dir = app.config["STORAGE_DIR"] * "files" / g.user["login"] user_dir.mkdir(parents=True, exist_ok=True) ts = dt.datetime.now(dt.UTC).strftime("%Y%m%dT%H%M%S%fZ")</pre></div><div class="alert alert-secondary"><pre class="diff">...F.F.F.FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } &gt; resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:147: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 &gt; user_dir = app.config["STORAGE_DIR"] * "files" / g.user["login"] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: can't multiply sequence by non-int of type 'WindowsPath' server.py:341: TypeError __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } &gt; upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:387: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 &gt; user_dir = app.config["STORAGE_DIR"] * "files" / g.user["login"] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: can't multiply sequence by non-int of type 'WindowsPath' server.py:341: TypeError _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - TypeError: can't mul... FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - TypeError: can't mult... FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 6 failed, 8 passed, 22 warnings in 19.42s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_117"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_117_1" aria-expanded="false" aria-controls="job_list___sub_collapse_117_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_117_1"><button class="btn btn-outline-success"><span class="job_id">117 : Job ID 5309965a0e0b4d918abe892a88cb62cd</span></button></div></a><div aria-labelledby="job_list___sub_heading_117_1" data-parent="#job_list___sub_accordion_117" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_117_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=341" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (341, 55), end pos: (341, 56)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Mul, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -338,7 +338,7 @@ ) return jsonify({"error": "invalid filename"}), 400 - user_dir = app.config["STORAGE_DIR"] / "files" / g.user["login"] + user_dir = app.config["STORAGE_DIR"] / "files" * g.user["login"] user_dir.mkdir(parents=True, exist_ok=True) ts = dt.datetime.now(dt.UTC).strftime("%Y%m%dT%H%M%S%fZ")</pre></div><div class="alert alert-secondary"><pre class="diff">...F.F.F.FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } &gt; resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:147: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 &gt; user_dir = app.config["STORAGE_DIR"] / "files" * g.user["login"] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: can't multiply sequence by non-int of type 'WindowsPath' server.py:341: TypeError __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } &gt; upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:387: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 &gt; user_dir = app.config["STORAGE_DIR"] / "files" * g.user["login"] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: can't multiply sequence by non-int of type 'WindowsPath' server.py:341: TypeError _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - TypeError: can't mul... FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - TypeError: can't mult... FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 6 failed, 8 passed, 22 warnings in 19.84s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_118"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_118_1" aria-expanded="false" aria-controls="job_list___sub_collapse_118_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_118_1"><button class="btn btn-outline-success"><span class="job_id">118 : Job ID c33b668fb9534c2b865eb20a5ad9bd69</span></button></div></a><div aria-labelledby="job_list___sub_heading_118_1" data-parent="#job_list___sub_accordion_118" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_118_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=350" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (350, 36), end pos: (350, 37)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Mul, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -347,7 +347,7 @@ try: # Check for path traversal attempts - stored_path = (user_dir / stored_name).resolve() + stored_path = (user_dir * stored_name).resolve() if not str(stored_path).startswith(str(user_dir.resolve())): app.logger.warning("Upload attempt with invalid path: %s", stored_path) return jsonify({"error": "invalid path"}), 400</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: can't multiply sequence by non-int of type 'WindowsPath' __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: can't multiply sequence by non-int of type 'WindowsPath' _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 500 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.81s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_119"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_119_1" aria-expanded="false" aria-controls="job_list___sub_collapse_119_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_119_1"><button class="btn btn-outline-danger"><span class="job_id">119 : Job ID 8e0aa42af9c7444ea7345dfa99e4dcef</span></button></div></a><div aria-labelledby="job_list___sub_heading_119_1" data-parent="#job_list___sub_accordion_119" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_119_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=785" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (785, 30), end pos: (785, 31)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Mul, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -782,7 +782,7 @@ storage_root = storage_root.resolve() fp = Path(p) if not fp.is_absolute(): - fp = storage_root / fp + fp = storage_root * fp fp = fp.resolve() # Python 3.12 has is_relative_to on Path if hasattr(fp, "is_relative_to"):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.03s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_120"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_120_1" aria-expanded="false" aria-controls="job_list___sub_collapse_120_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_120_1"><button class="btn btn-outline-success"><span class="job_id">120 : Job ID 35acf1745d30408185bfc9a2d0d3df1e</span></button></div></a><div aria-labelledby="job_list___sub_heading_120_1" data-parent="#job_list___sub_accordion_120" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_120_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=981" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (981, 37), end pos: (981, 38)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Mul, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -978,7 +978,7 @@ storage_root = Path(app.config["STORAGE_DIR"]).resolve() file_path = Path(row.path) if not file_path.is_absolute(): - file_path = storage_root / file_path + file_path = storage_root * file_path file_path = file_path.resolve() try: file_path.relative_to(storage_root)</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e82477b8885eeb69a: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.73s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_121"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_121_1" aria-expanded="false" aria-controls="job_list___sub_collapse_121_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_121_1"><button class="btn btn-outline-success"><span class="job_id">121 : Job ID ff2d79ab0da24e929a45690609a05e31</span></button></div></a><div aria-labelledby="job_list___sub_heading_121_1" data-parent="#job_list___sub_accordion_121" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_121_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1045" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1045, 36), end pos: (1045, 37)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Mul, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1042,7 +1042,7 @@ # build destination file name: "&lt;original_name&gt;__&lt;intended_to&gt;.pdf" base_name = Path(row.name or file_path.name).stem intended_slug = secure_filename(intended_for) - dest_dir = file_path.parent / "watermarks" + dest_dir = file_path.parent * "watermarks" dest_dir.mkdir(parents=True, exist_ok=True) candidate = f"{base_name}__{intended_slug}.pdf"</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} &gt; resp = client.post("/api/create-watermark", json=parameters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:317: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ document_id = 1 @app.post("/api/create-watermark") @app.post("/api/create-watermark/&lt;int:document_id&gt;") @require_auth def create_watermark(document_id: int | None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on GET if not document_id: document_id = ( request.args.get("id") or request.args.get("documentid") or (request.is_json and (request.get_json(silent=True) or {}).get("id")) ) try: doc_id = document_id except (TypeError, ValueError): app.logger.warning("Invalid document id in query: %s", document_id) return jsonify({"error": "document id required"}), 400 payload = request.get_json(silent=True) or {} # allow a couple of aliases for convenience method = payload.get("method") intended_for = payload.get("intended_for") position = payload.get("position") or None secret = payload.get("secret") key = payload.get("key") # validate input try: if doc_id is None: app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id) return jsonify({"error": "document_id (int) is required"}), 400 if ( not method or not intended_for or not isinstance(secret, str) or not isinstance(key, str) ): app.logger.warning("Missing required fields for watermarking: %s", payload) return jsonify( {"error": "method, intended_for, secret, and key are required"} ), 400 # lookup the document; enforce ownership try: with get_engine().connect() as conn: row = conn.execute( text( """ SELECT id, name, path FROM Documents WHERE id = :id AND ownerid = :owner LIMIT 1 """ ), {"id": doc_id, "owner": int(g.user["id"])}, ).first() except Exception as e: app.logger.error("Database error fetching document %s", e) return jsonify({"error": "database error"}), 503 if not row: app.logger.warning( "Document not found or access denied for watermarking id=%s", doc_id ) return jsonify({"error": "document not found"}), 404 # resolve path safely under STORAGE_DIR storage_root = Path(app.config["STORAGE_DIR"]).resolve() file_path = Path(row.path) if not file_path.is_absolute(): file_path = storage_root / file_path file_path = file_path.resolve() try: file_path.relative_to(storage_root) except ValueError: app.logger.warning("Rejected document path for id %s: %s", doc_id, row.path) return jsonify({"error": "document path invalid"}), 500 if not file_path.exists(): app.logger.error("File missing on disk for document id=%s", doc_id) return jsonify({"error": "file missing on disk"}), 410 # check watermark applicability try: applicable = WMUtils.is_watermarking_applicable( method=method, pdf=str(file_path), position=position ) if applicable is False: inc_watermark_failed(method, "applicability") app.logger.info( "Watermarking method %s not applicable for document %s", method, doc_id, ) return jsonify({"error": "watermarking method not applicable"}), 400 except Exception as e: inc_watermark_failed(method, "applicability_exception") app.logger.error( "Watermark applicability check failed for document %s: %s", doc_id, e ) return jsonify({"error": "watermark applicability check failed"}), 400 # apply watermark ÔåÆ bytes try: _wm_start = time.time() wm_bytes: bytes = WMUtils.apply_watermark( pdf=str(file_path), secret=secret, key=key, method=method, intended_for=intended_for, position=position, ) observe_watermark_duration(method, time.time() - _wm_start) if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: inc_watermark_failed(method, "empty_output") app.logger.error( "Watermarking produced no output for document %s using method %s", doc_id, method, ) return jsonify({"error": "watermarking produced no output"}), 500 except Exception as e: inc_watermark_failed(method, "exception") app.logger.error( "Watermarking failed for document %s using method %s: %s", doc_id, method, e, ) return jsonify({"error": "watermarking failed"}), 500 # build destination file name: "&lt;original_name&gt;__&lt;intended_to&gt;.pdf" base_name = Path(row.name or file_path.name).stem intended_slug = secure_filename(intended_for) &gt; dest_dir = file_path.parent * "watermarks" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: can't multiply sequence by non-int of type 'WindowsPath' server.py:1045: TypeError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - TypeError: can't mu... 1 failed, 13 passed, 22 warnings in 21.59s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_122"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_122_1" aria-expanded="false" aria-controls="job_list___sub_collapse_122_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_122_1"><button class="btn btn-outline-success"><span class="job_id">122 : Job ID d7043dcc47f548aab3366ef75d4e2ae2</span></button></div></a><div aria-labelledby="job_list___sub_heading_122_1" data-parent="#job_list___sub_accordion_122" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_122_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1049" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1049, 29), end pos: (1049, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Mul, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1046,7 +1046,7 @@ dest_dir.mkdir(parents=True, exist_ok=True) candidate = f"{base_name}__{intended_slug}.pdf" - dest_path = dest_dir / candidate + dest_path = dest_dir * candidate # write bytes try:</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} &gt; resp = client.post("/api/create-watermark", json=parameters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:317: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ document_id = 1 @app.post("/api/create-watermark") @app.post("/api/create-watermark/&lt;int:document_id&gt;") @require_auth def create_watermark(document_id: int | None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on GET if not document_id: document_id = ( request.args.get("id") or request.args.get("documentid") or (request.is_json and (request.get_json(silent=True) or {}).get("id")) ) try: doc_id = document_id except (TypeError, ValueError): app.logger.warning("Invalid document id in query: %s", document_id) return jsonify({"error": "document id required"}), 400 payload = request.get_json(silent=True) or {} # allow a couple of aliases for convenience method = payload.get("method") intended_for = payload.get("intended_for") position = payload.get("position") or None secret = payload.get("secret") key = payload.get("key") # validate input try: if doc_id is None: app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id) return jsonify({"error": "document_id (int) is required"}), 400 if ( not method or not intended_for or not isinstance(secret, str) or not isinstance(key, str) ): app.logger.warning("Missing required fields for watermarking: %s", payload) return jsonify( {"error": "method, intended_for, secret, and key are required"} ), 400 # lookup the document; enforce ownership try: with get_engine().connect() as conn: row = conn.execute( text( """ SELECT id, name, path FROM Documents WHERE id = :id AND ownerid = :owner LIMIT 1 """ ), {"id": doc_id, "owner": int(g.user["id"])}, ).first() except Exception as e: app.logger.error("Database error fetching document %s", e) return jsonify({"error": "database error"}), 503 if not row: app.logger.warning( "Document not found or access denied for watermarking id=%s", doc_id ) return jsonify({"error": "document not found"}), 404 # resolve path safely under STORAGE_DIR storage_root = Path(app.config["STORAGE_DIR"]).resolve() file_path = Path(row.path) if not file_path.is_absolute(): file_path = storage_root / file_path file_path = file_path.resolve() try: file_path.relative_to(storage_root) except ValueError: app.logger.warning("Rejected document path for id %s: %s", doc_id, row.path) return jsonify({"error": "document path invalid"}), 500 if not file_path.exists(): app.logger.error("File missing on disk for document id=%s", doc_id) return jsonify({"error": "file missing on disk"}), 410 # check watermark applicability try: applicable = WMUtils.is_watermarking_applicable( method=method, pdf=str(file_path), position=position ) if applicable is False: inc_watermark_failed(method, "applicability") app.logger.info( "Watermarking method %s not applicable for document %s", method, doc_id, ) return jsonify({"error": "watermarking method not applicable"}), 400 except Exception as e: inc_watermark_failed(method, "applicability_exception") app.logger.error( "Watermark applicability check failed for document %s: %s", doc_id, e ) return jsonify({"error": "watermark applicability check failed"}), 400 # apply watermark ÔåÆ bytes try: _wm_start = time.time() wm_bytes: bytes = WMUtils.apply_watermark( pdf=str(file_path), secret=secret, key=key, method=method, intended_for=intended_for, position=position, ) observe_watermark_duration(method, time.time() - _wm_start) if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: inc_watermark_failed(method, "empty_output") app.logger.error( "Watermarking produced no output for document %s using method %s", doc_id, method, ) return jsonify({"error": "watermarking produced no output"}), 500 except Exception as e: inc_watermark_failed(method, "exception") app.logger.error( "Watermarking failed for document %s using method %s: %s", doc_id, method, e, ) return jsonify({"error": "watermarking failed"}), 500 # build destination file name: "&lt;original_name&gt;__&lt;intended_to&gt;.pdf" base_name = Path(row.name or file_path.name).stem intended_slug = secure_filename(intended_for) dest_dir = file_path.parent / "watermarks" dest_dir.mkdir(parents=True, exist_ok=True) candidate = f"{base_name}__{intended_slug}.pdf" &gt; dest_path = dest_dir * candidate ^^^^^^^^^^^^^^^^^^^^ E TypeError: can't multiply sequence by non-int of type 'WindowsPath' server.py:1049: TypeError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - TypeError: can't mu... 1 failed, 13 passed, 22 warnings in 20.97s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_123"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_123_1" aria-expanded="false" aria-controls="job_list___sub_collapse_123_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_123_1"><button class="btn btn-outline-success"><span class="job_id">123 : Job ID a442df6789784752989eb49927e6429e</span></button></div></a><div aria-labelledby="job_list___sub_heading_123_1" data-parent="#job_list___sub_accordion_123" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_123_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1211" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1211, 37), end pos: (1211, 38)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Mul, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1208,7 +1208,7 @@ storage_root = Path(app.config["STORAGE_DIR"]).resolve() file_path = Path(row.path) if not file_path.is_absolute(): - file_path = storage_root / file_path + file_path = storage_root * file_path file_path = file_path.resolve() try: file_path.relative_to(storage_root)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T212446329083Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T212447309043Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 20.35s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_124"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_124_1" aria-expanded="false" aria-controls="job_list___sub_collapse_124_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_124_1"><button class="btn btn-outline-success"><span class="job_id">124 : Job ID 9b5010032b1340bb84c7ecf2bbbfa99b</span></button></div></a><div aria-labelledby="job_list___sub_heading_124_1" data-parent="#job_list___sub_accordion_124" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_124_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=341" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (341, 45), end pos: (341, 46)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_FloorDiv, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -338,7 +338,7 @@ ) return jsonify({"error": "invalid filename"}), 400 - user_dir = app.config["STORAGE_DIR"] / "files" / g.user["login"] + user_dir = app.config["STORAGE_DIR"] // "files" / g.user["login"] user_dir.mkdir(parents=True, exist_ok=True) ts = dt.datetime.now(dt.UTC).strftime("%Y%m%dT%H%M%S%fZ")</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } &gt; resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:147: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 &gt; user_dir = app.config["STORAGE_DIR"] // "files" / g.user["login"] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for //: 'WindowsPath' and 'str' server.py:341: TypeError __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } &gt; upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:387: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 &gt; user_dir = app.config["STORAGE_DIR"] // "files" / g.user["login"] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for //: 'WindowsPath' and 'str' server.py:341: TypeError _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - TypeError: unsupport... FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - TypeError: unsupporte... FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.30s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_125"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_125_1" aria-expanded="false" aria-controls="job_list___sub_collapse_125_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_125_1"><button class="btn btn-outline-success"><span class="job_id">125 : Job ID e29f33189b614e9cb404c39596a45785</span></button></div></a><div aria-labelledby="job_list___sub_heading_125_1" data-parent="#job_list___sub_accordion_125" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_125_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=341" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (341, 55), end pos: (341, 56)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_FloorDiv, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -338,7 +338,7 @@ ) return jsonify({"error": "invalid filename"}), 400 - user_dir = app.config["STORAGE_DIR"] / "files" / g.user["login"] + user_dir = app.config["STORAGE_DIR"] / "files" // g.user["login"] user_dir.mkdir(parents=True, exist_ok=True) ts = dt.datetime.now(dt.UTC).strftime("%Y%m%dT%H%M%S%fZ")</pre></div><div class="alert alert-secondary"><pre class="diff">...F.F.F.FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } &gt; resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:147: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 &gt; user_dir = app.config["STORAGE_DIR"] / "files" // g.user["login"] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for //: 'WindowsPath' and 'str' server.py:341: TypeError __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } &gt; upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:387: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 &gt; user_dir = app.config["STORAGE_DIR"] / "files" // g.user["login"] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for //: 'WindowsPath' and 'str' server.py:341: TypeError _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - TypeError: unsupport... FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - TypeError: unsupporte... FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 6 failed, 8 passed, 22 warnings in 19.26s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_126"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_126_1" aria-expanded="false" aria-controls="job_list___sub_collapse_126_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_126_1"><button class="btn btn-outline-success"><span class="job_id">126 : Job ID becea351adb24c7f8b64fd39b6ef1545</span></button></div></a><div aria-labelledby="job_list___sub_heading_126_1" data-parent="#job_list___sub_accordion_126" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_126_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=350" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (350, 36), end pos: (350, 37)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_FloorDiv, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -347,7 +347,7 @@ try: # Check for path traversal attempts - stored_path = (user_dir / stored_name).resolve() + stored_path = (user_dir // stored_name).resolve() if not str(stored_path).startswith(str(user_dir.resolve())): app.logger.warning("Upload attempt with invalid path: %s", stored_path) return jsonify({"error": "invalid path"}), 400</pre></div><div class="alert alert-secondary"><pre class="diff">...F.F.F.FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: unsupported operand type(s) for //: 'WindowsPath' and 'str' __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: unsupported operand type(s) for //: 'WindowsPath' and 'str' _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - assert 500 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 6 failed, 8 passed, 22 warnings in 19.16s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_127"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_127_1" aria-expanded="false" aria-controls="job_list___sub_collapse_127_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_127_1"><button class="btn btn-outline-danger"><span class="job_id">127 : Job ID a42c01702e7d451c962bd5d04a709115</span></button></div></a><div aria-labelledby="job_list___sub_heading_127_1" data-parent="#job_list___sub_accordion_127" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_127_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=785" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (785, 30), end pos: (785, 31)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_FloorDiv, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -782,7 +782,7 @@ storage_root = storage_root.resolve() fp = Path(p) if not fp.is_absolute(): - fp = storage_root / fp + fp = storage_root // fp fp = fp.resolve() # Python 3.12 has is_relative_to on Path if hasattr(fp, "is_relative_to"):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.15s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_128"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_128_1" aria-expanded="false" aria-controls="job_list___sub_collapse_128_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_128_1"><button class="btn btn-outline-danger"><span class="job_id">128 : Job ID b46dac2c2bab49b690ae66be42528116</span></button></div></a><div aria-labelledby="job_list___sub_heading_128_1" data-parent="#job_list___sub_accordion_128" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_128_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=981" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (981, 37), end pos: (981, 38)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_FloorDiv, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -978,7 +978,7 @@ storage_root = Path(app.config["STORAGE_DIR"]).resolve() file_path = Path(row.path) if not file_path.is_absolute(): - file_path = storage_root / file_path + file_path = storage_root // file_path file_path = file_path.resolve() try: file_path.relative_to(storage_root)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.20s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_129"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_129_1" aria-expanded="false" aria-controls="job_list___sub_collapse_129_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_129_1"><button class="btn btn-outline-success"><span class="job_id">129 : Job ID 6150d5a26e2745a3920a18d39e8fc1bf</span></button></div></a><div aria-labelledby="job_list___sub_heading_129_1" data-parent="#job_list___sub_accordion_129" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_129_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1045" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1045, 36), end pos: (1045, 37)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_FloorDiv, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1042,7 +1042,7 @@ # build destination file name: "&lt;original_name&gt;__&lt;intended_to&gt;.pdf" base_name = Path(row.name or file_path.name).stem intended_slug = secure_filename(intended_for) - dest_dir = file_path.parent / "watermarks" + dest_dir = file_path.parent // "watermarks" dest_dir.mkdir(parents=True, exist_ok=True) candidate = f"{base_name}__{intended_slug}.pdf"</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} &gt; resp = client.post("/api/create-watermark", json=parameters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:317: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ document_id = 1 @app.post("/api/create-watermark") @app.post("/api/create-watermark/&lt;int:document_id&gt;") @require_auth def create_watermark(document_id: int | None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on GET if not document_id: document_id = ( request.args.get("id") or request.args.get("documentid") or (request.is_json and (request.get_json(silent=True) or {}).get("id")) ) try: doc_id = document_id except (TypeError, ValueError): app.logger.warning("Invalid document id in query: %s", document_id) return jsonify({"error": "document id required"}), 400 payload = request.get_json(silent=True) or {} # allow a couple of aliases for convenience method = payload.get("method") intended_for = payload.get("intended_for") position = payload.get("position") or None secret = payload.get("secret") key = payload.get("key") # validate input try: if doc_id is None: app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id) return jsonify({"error": "document_id (int) is required"}), 400 if ( not method or not intended_for or not isinstance(secret, str) or not isinstance(key, str) ): app.logger.warning("Missing required fields for watermarking: %s", payload) return jsonify( {"error": "method, intended_for, secret, and key are required"} ), 400 # lookup the document; enforce ownership try: with get_engine().connect() as conn: row = conn.execute( text( """ SELECT id, name, path FROM Documents WHERE id = :id AND ownerid = :owner LIMIT 1 """ ), {"id": doc_id, "owner": int(g.user["id"])}, ).first() except Exception as e: app.logger.error("Database error fetching document %s", e) return jsonify({"error": "database error"}), 503 if not row: app.logger.warning( "Document not found or access denied for watermarking id=%s", doc_id ) return jsonify({"error": "document not found"}), 404 # resolve path safely under STORAGE_DIR storage_root = Path(app.config["STORAGE_DIR"]).resolve() file_path = Path(row.path) if not file_path.is_absolute(): file_path = storage_root / file_path file_path = file_path.resolve() try: file_path.relative_to(storage_root) except ValueError: app.logger.warning("Rejected document path for id %s: %s", doc_id, row.path) return jsonify({"error": "document path invalid"}), 500 if not file_path.exists(): app.logger.error("File missing on disk for document id=%s", doc_id) return jsonify({"error": "file missing on disk"}), 410 # check watermark applicability try: applicable = WMUtils.is_watermarking_applicable( method=method, pdf=str(file_path), position=position ) if applicable is False: inc_watermark_failed(method, "applicability") app.logger.info( "Watermarking method %s not applicable for document %s", method, doc_id, ) return jsonify({"error": "watermarking method not applicable"}), 400 except Exception as e: inc_watermark_failed(method, "applicability_exception") app.logger.error( "Watermark applicability check failed for document %s: %s", doc_id, e ) return jsonify({"error": "watermark applicability check failed"}), 400 # apply watermark  bytes try: _wm_start = time.time() wm_bytes: bytes = WMUtils.apply_watermark( pdf=str(file_path), secret=secret, key=key, method=method, intended_for=intended_for, position=position, ) observe_watermark_duration(method, time.time() - _wm_start) if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: inc_watermark_failed(method, "empty_output") app.logger.error( "Watermarking produced no output for document %s using method %s", doc_id, method, ) return jsonify({"error": "watermarking produced no output"}), 500 except Exception as e: inc_watermark_failed(method, "exception") app.logger.error( "Watermarking failed for document %s using method %s: %s", doc_id, method, e, ) return jsonify({"error": "watermarking failed"}), 500 # build destination file name: "&lt;original_name&gt;__&lt;intended_to&gt;.pdf" base_name = Path(row.name or file_path.name).stem intended_slug = secure_filename(intended_for) &gt; dest_dir = file_path.parent // "watermarks" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for //: 'WindowsPath' and 'str' server.py:1045: TypeError __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e9ed6a6d91db82f84: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - TypeError: unsuppor... FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.63s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_130"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_130_1" aria-expanded="false" aria-controls="job_list___sub_collapse_130_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_130_1"><button class="btn btn-outline-success"><span class="job_id">130 : Job ID 6c1c66d88c314f4d90f2600545a9c032</span></button></div></a><div aria-labelledby="job_list___sub_heading_130_1" data-parent="#job_list___sub_accordion_130" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_130_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1049" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1049, 29), end pos: (1049, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_FloorDiv, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1046,7 +1046,7 @@ dest_dir.mkdir(parents=True, exist_ok=True) candidate = f"{base_name}__{intended_slug}.pdf" - dest_path = dest_dir / candidate + dest_path = dest_dir // candidate # write bytes try:</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} &gt; resp = client.post("/api/create-watermark", json=parameters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:317: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ document_id = 1 @app.post("/api/create-watermark") @app.post("/api/create-watermark/&lt;int:document_id&gt;") @require_auth def create_watermark(document_id: int | None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on GET if not document_id: document_id = ( request.args.get("id") or request.args.get("documentid") or (request.is_json and (request.get_json(silent=True) or {}).get("id")) ) try: doc_id = document_id except (TypeError, ValueError): app.logger.warning("Invalid document id in query: %s", document_id) return jsonify({"error": "document id required"}), 400 payload = request.get_json(silent=True) or {} # allow a couple of aliases for convenience method = payload.get("method") intended_for = payload.get("intended_for") position = payload.get("position") or None secret = payload.get("secret") key = payload.get("key") # validate input try: if doc_id is None: app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id) return jsonify({"error": "document_id (int) is required"}), 400 if ( not method or not intended_for or not isinstance(secret, str) or not isinstance(key, str) ): app.logger.warning("Missing required fields for watermarking: %s", payload) return jsonify( {"error": "method, intended_for, secret, and key are required"} ), 400 # lookup the document; enforce ownership try: with get_engine().connect() as conn: row = conn.execute( text( """ SELECT id, name, path FROM Documents WHERE id = :id AND ownerid = :owner LIMIT 1 """ ), {"id": doc_id, "owner": int(g.user["id"])}, ).first() except Exception as e: app.logger.error("Database error fetching document %s", e) return jsonify({"error": "database error"}), 503 if not row: app.logger.warning( "Document not found or access denied for watermarking id=%s", doc_id ) return jsonify({"error": "document not found"}), 404 # resolve path safely under STORAGE_DIR storage_root = Path(app.config["STORAGE_DIR"]).resolve() file_path = Path(row.path) if not file_path.is_absolute(): file_path = storage_root / file_path file_path = file_path.resolve() try: file_path.relative_to(storage_root) except ValueError: app.logger.warning("Rejected document path for id %s: %s", doc_id, row.path) return jsonify({"error": "document path invalid"}), 500 if not file_path.exists(): app.logger.error("File missing on disk for document id=%s", doc_id) return jsonify({"error": "file missing on disk"}), 410 # check watermark applicability try: applicable = WMUtils.is_watermarking_applicable( method=method, pdf=str(file_path), position=position ) if applicable is False: inc_watermark_failed(method, "applicability") app.logger.info( "Watermarking method %s not applicable for document %s", method, doc_id, ) return jsonify({"error": "watermarking method not applicable"}), 400 except Exception as e: inc_watermark_failed(method, "applicability_exception") app.logger.error( "Watermark applicability check failed for document %s: %s", doc_id, e ) return jsonify({"error": "watermark applicability check failed"}), 400 # apply watermark  bytes try: _wm_start = time.time() wm_bytes: bytes = WMUtils.apply_watermark( pdf=str(file_path), secret=secret, key=key, method=method, intended_for=intended_for, position=position, ) observe_watermark_duration(method, time.time() - _wm_start) if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: inc_watermark_failed(method, "empty_output") app.logger.error( "Watermarking produced no output for document %s using method %s", doc_id, method, ) return jsonify({"error": "watermarking produced no output"}), 500 except Exception as e: inc_watermark_failed(method, "exception") app.logger.error( "Watermarking failed for document %s using method %s: %s", doc_id, method, e, ) return jsonify({"error": "watermarking failed"}), 500 # build destination file name: "&lt;original_name&gt;__&lt;intended_to&gt;.pdf" base_name = Path(row.name or file_path.name).stem intended_slug = secure_filename(intended_for) dest_dir = file_path.parent / "watermarks" dest_dir.mkdir(parents=True, exist_ok=True) candidate = f"{base_name}__{intended_slug}.pdf" &gt; dest_path = dest_dir // candidate ^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for //: 'WindowsPath' and 'str' server.py:1049: TypeError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - TypeError: unsuppor... 1 failed, 13 passed, 22 warnings in 20.12s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_131"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_131_1" aria-expanded="false" aria-controls="job_list___sub_collapse_131_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_131_1"><button class="btn btn-outline-success"><span class="job_id">131 : Job ID 07cb9a59eb674bb189e94ee2f5f35c58</span></button></div></a><div aria-labelledby="job_list___sub_heading_131_1" data-parent="#job_list___sub_accordion_131" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_131_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1211" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1211, 37), end pos: (1211, 38)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_FloorDiv, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1208,7 +1208,7 @@ storage_root = Path(app.config["STORAGE_DIR"]).resolve() file_path = Path(row.path) if not file_path.is_absolute(): - file_path = storage_root / file_path + file_path = storage_root // file_path file_path = file_path.resolve() try: file_path.relative_to(storage_root)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T163523937722Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T163524862022Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.33s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_132"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_132_1" aria-expanded="false" aria-controls="job_list___sub_collapse_132_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_132_1"><button class="btn btn-outline-success"><span class="job_id">132 : Job ID ed23b9bbfc0349b991f9430c069309a1</span></button></div></a><div aria-labelledby="job_list___sub_heading_132_1" data-parent="#job_list___sub_accordion_132" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_132_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=341" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (341, 45), end pos: (341, 46)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Mod, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -338,7 +338,7 @@ ) return jsonify({"error": "invalid filename"}), 400 - user_dir = app.config["STORAGE_DIR"] / "files" / g.user["login"] + user_dir = app.config["STORAGE_DIR"] % "files" / g.user["login"] user_dir.mkdir(parents=True, exist_ok=True) ts = dt.datetime.now(dt.UTC).strftime("%Y%m%dT%H%M%S%fZ")</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } &gt; resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:147: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 &gt; user_dir = app.config["STORAGE_DIR"] % "files" / g.user["login"] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for %: 'WindowsPath' and 'str' server.py:341: TypeError __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } &gt; upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:387: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 &gt; user_dir = app.config["STORAGE_DIR"] % "files" / g.user["login"] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for %: 'WindowsPath' and 'str' server.py:341: TypeError _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - TypeError: unsupport... FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - TypeError: unsupporte... FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 20.45s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_133"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_133_1" aria-expanded="false" aria-controls="job_list___sub_collapse_133_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_133_1"><button class="btn btn-outline-success"><span class="job_id">133 : Job ID 408cfd1aa4dd40f79ce1e7b065f57840</span></button></div></a><div aria-labelledby="job_list___sub_heading_133_1" data-parent="#job_list___sub_accordion_133" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_133_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=341" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (341, 55), end pos: (341, 56)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Mod, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -338,7 +338,7 @@ ) return jsonify({"error": "invalid filename"}), 400 - user_dir = app.config["STORAGE_DIR"] / "files" / g.user["login"] + user_dir = app.config["STORAGE_DIR"] / "files" % g.user["login"] user_dir.mkdir(parents=True, exist_ok=True) ts = dt.datetime.now(dt.UTC).strftime("%Y%m%dT%H%M%S%fZ")</pre></div><div class="alert alert-secondary"><pre class="diff">...F.F.F.FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } &gt; resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:147: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 &gt; user_dir = app.config["STORAGE_DIR"] / "files" % g.user["login"] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for %: 'WindowsPath' and 'str' server.py:341: TypeError __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } &gt; upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:387: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 &gt; user_dir = app.config["STORAGE_DIR"] / "files" % g.user["login"] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for %: 'WindowsPath' and 'str' server.py:341: TypeError _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - TypeError: unsupport... FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - TypeError: unsupporte... FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 6 failed, 8 passed, 22 warnings in 19.48s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_134"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_134_1" aria-expanded="false" aria-controls="job_list___sub_collapse_134_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_134_1"><button class="btn btn-outline-success"><span class="job_id">134 : Job ID 04232aca16704a0c9b19c6044234653c</span></button></div></a><div aria-labelledby="job_list___sub_heading_134_1" data-parent="#job_list___sub_accordion_134" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_134_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=350" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (350, 36), end pos: (350, 37)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Mod, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -347,7 +347,7 @@ try: # Check for path traversal attempts - stored_path = (user_dir / stored_name).resolve() + stored_path = (user_dir % stored_name).resolve() if not str(stored_path).startswith(str(user_dir.resolve())): app.logger.warning("Upload attempt with invalid path: %s", stored_path) return jsonify({"error": "invalid path"}), 400</pre></div><div class="alert alert-secondary"><pre class="diff">...F.F.F.FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: unsupported operand type(s) for %: 'WindowsPath' and 'str' __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: unsupported operand type(s) for %: 'WindowsPath' and 'str' _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - assert 500 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 6 failed, 8 passed, 22 warnings in 19.45s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_135"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_135_1" aria-expanded="false" aria-controls="job_list___sub_collapse_135_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_135_1"><button class="btn btn-outline-danger"><span class="job_id">135 : Job ID 31c34bdd340a4c5895df1a27c927657c</span></button></div></a><div aria-labelledby="job_list___sub_heading_135_1" data-parent="#job_list___sub_accordion_135" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_135_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=785" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (785, 30), end pos: (785, 31)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Mod, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -782,7 +782,7 @@ storage_root = storage_root.resolve() fp = Path(p) if not fp.is_absolute(): - fp = storage_root / fp + fp = storage_root % fp fp = fp.resolve() # Python 3.12 has is_relative_to on Path if hasattr(fp, "is_relative_to"):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.38s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_136"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_136_1" aria-expanded="false" aria-controls="job_list___sub_collapse_136_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_136_1"><button class="btn btn-outline-danger"><span class="job_id">136 : Job ID 4b433610526e493bbfe4cdd18b2733ba</span></button></div></a><div aria-labelledby="job_list___sub_heading_136_1" data-parent="#job_list___sub_accordion_136" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_136_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=981" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (981, 37), end pos: (981, 38)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Mod, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -978,7 +978,7 @@ storage_root = Path(app.config["STORAGE_DIR"]).resolve() file_path = Path(row.path) if not file_path.is_absolute(): - file_path = storage_root / file_path + file_path = storage_root % file_path file_path = file_path.resolve() try: file_path.relative_to(storage_root)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.25s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_137"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_137_1" aria-expanded="false" aria-controls="job_list___sub_collapse_137_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_137_1"><button class="btn btn-outline-success"><span class="job_id">137 : Job ID f9625369c1494ed7afa854aa29a75d30</span></button></div></a><div aria-labelledby="job_list___sub_heading_137_1" data-parent="#job_list___sub_accordion_137" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_137_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1045" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1045, 36), end pos: (1045, 37)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Mod, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1042,7 +1042,7 @@ # build destination file name: "&lt;original_name&gt;__&lt;intended_to&gt;.pdf" base_name = Path(row.name or file_path.name).stem intended_slug = secure_filename(intended_for) - dest_dir = file_path.parent / "watermarks" + dest_dir = file_path.parent % "watermarks" dest_dir.mkdir(parents=True, exist_ok=True) candidate = f"{base_name}__{intended_slug}.pdf"</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} &gt; resp = client.post("/api/create-watermark", json=parameters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:317: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ document_id = 1 @app.post("/api/create-watermark") @app.post("/api/create-watermark/&lt;int:document_id&gt;") @require_auth def create_watermark(document_id: int | None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on GET if not document_id: document_id = ( request.args.get("id") or request.args.get("documentid") or (request.is_json and (request.get_json(silent=True) or {}).get("id")) ) try: doc_id = document_id except (TypeError, ValueError): app.logger.warning("Invalid document id in query: %s", document_id) return jsonify({"error": "document id required"}), 400 payload = request.get_json(silent=True) or {} # allow a couple of aliases for convenience method = payload.get("method") intended_for = payload.get("intended_for") position = payload.get("position") or None secret = payload.get("secret") key = payload.get("key") # validate input try: if doc_id is None: app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id) return jsonify({"error": "document_id (int) is required"}), 400 if ( not method or not intended_for or not isinstance(secret, str) or not isinstance(key, str) ): app.logger.warning("Missing required fields for watermarking: %s", payload) return jsonify( {"error": "method, intended_for, secret, and key are required"} ), 400 # lookup the document; enforce ownership try: with get_engine().connect() as conn: row = conn.execute( text( """ SELECT id, name, path FROM Documents WHERE id = :id AND ownerid = :owner LIMIT 1 """ ), {"id": doc_id, "owner": int(g.user["id"])}, ).first() except Exception as e: app.logger.error("Database error fetching document %s", e) return jsonify({"error": "database error"}), 503 if not row: app.logger.warning( "Document not found or access denied for watermarking id=%s", doc_id ) return jsonify({"error": "document not found"}), 404 # resolve path safely under STORAGE_DIR storage_root = Path(app.config["STORAGE_DIR"]).resolve() file_path = Path(row.path) if not file_path.is_absolute(): file_path = storage_root / file_path file_path = file_path.resolve() try: file_path.relative_to(storage_root) except ValueError: app.logger.warning("Rejected document path for id %s: %s", doc_id, row.path) return jsonify({"error": "document path invalid"}), 500 if not file_path.exists(): app.logger.error("File missing on disk for document id=%s", doc_id) return jsonify({"error": "file missing on disk"}), 410 # check watermark applicability try: applicable = WMUtils.is_watermarking_applicable( method=method, pdf=str(file_path), position=position ) if applicable is False: inc_watermark_failed(method, "applicability") app.logger.info( "Watermarking method %s not applicable for document %s", method, doc_id, ) return jsonify({"error": "watermarking method not applicable"}), 400 except Exception as e: inc_watermark_failed(method, "applicability_exception") app.logger.error( "Watermark applicability check failed for document %s: %s", doc_id, e ) return jsonify({"error": "watermark applicability check failed"}), 400 # apply watermark  bytes try: _wm_start = time.time() wm_bytes: bytes = WMUtils.apply_watermark( pdf=str(file_path), secret=secret, key=key, method=method, intended_for=intended_for, position=position, ) observe_watermark_duration(method, time.time() - _wm_start) if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: inc_watermark_failed(method, "empty_output") app.logger.error( "Watermarking produced no output for document %s using method %s", doc_id, method, ) return jsonify({"error": "watermarking produced no output"}), 500 except Exception as e: inc_watermark_failed(method, "exception") app.logger.error( "Watermarking failed for document %s using method %s: %s", doc_id, method, e, ) return jsonify({"error": "watermarking failed"}), 500 # build destination file name: "&lt;original_name&gt;__&lt;intended_to&gt;.pdf" base_name = Path(row.name or file_path.name).stem intended_slug = secure_filename(intended_for) &gt; dest_dir = file_path.parent % "watermarks" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for %: 'WindowsPath' and 'str' server.py:1045: TypeError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - TypeError: unsuppor... 1 failed, 13 passed, 22 warnings in 20.45s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_138"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_138_1" aria-expanded="false" aria-controls="job_list___sub_collapse_138_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_138_1"><button class="btn btn-outline-success"><span class="job_id">138 : Job ID a058fa57d6ef439d9313503646ae423f</span></button></div></a><div aria-labelledby="job_list___sub_heading_138_1" data-parent="#job_list___sub_accordion_138" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_138_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1049" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1049, 29), end pos: (1049, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Mod, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1046,7 +1046,7 @@ dest_dir.mkdir(parents=True, exist_ok=True) candidate = f"{base_name}__{intended_slug}.pdf" - dest_path = dest_dir / candidate + dest_path = dest_dir % candidate # write bytes try:</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} &gt; resp = client.post("/api/create-watermark", json=parameters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:317: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ document_id = 1 @app.post("/api/create-watermark") @app.post("/api/create-watermark/&lt;int:document_id&gt;") @require_auth def create_watermark(document_id: int | None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on GET if not document_id: document_id = ( request.args.get("id") or request.args.get("documentid") or (request.is_json and (request.get_json(silent=True) or {}).get("id")) ) try: doc_id = document_id except (TypeError, ValueError): app.logger.warning("Invalid document id in query: %s", document_id) return jsonify({"error": "document id required"}), 400 payload = request.get_json(silent=True) or {} # allow a couple of aliases for convenience method = payload.get("method") intended_for = payload.get("intended_for") position = payload.get("position") or None secret = payload.get("secret") key = payload.get("key") # validate input try: if doc_id is None: app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id) return jsonify({"error": "document_id (int) is required"}), 400 if ( not method or not intended_for or not isinstance(secret, str) or not isinstance(key, str) ): app.logger.warning("Missing required fields for watermarking: %s", payload) return jsonify( {"error": "method, intended_for, secret, and key are required"} ), 400 # lookup the document; enforce ownership try: with get_engine().connect() as conn: row = conn.execute( text( """ SELECT id, name, path FROM Documents WHERE id = :id AND ownerid = :owner LIMIT 1 """ ), {"id": doc_id, "owner": int(g.user["id"])}, ).first() except Exception as e: app.logger.error("Database error fetching document %s", e) return jsonify({"error": "database error"}), 503 if not row: app.logger.warning( "Document not found or access denied for watermarking id=%s", doc_id ) return jsonify({"error": "document not found"}), 404 # resolve path safely under STORAGE_DIR storage_root = Path(app.config["STORAGE_DIR"]).resolve() file_path = Path(row.path) if not file_path.is_absolute(): file_path = storage_root / file_path file_path = file_path.resolve() try: file_path.relative_to(storage_root) except ValueError: app.logger.warning("Rejected document path for id %s: %s", doc_id, row.path) return jsonify({"error": "document path invalid"}), 500 if not file_path.exists(): app.logger.error("File missing on disk for document id=%s", doc_id) return jsonify({"error": "file missing on disk"}), 410 # check watermark applicability try: applicable = WMUtils.is_watermarking_applicable( method=method, pdf=str(file_path), position=position ) if applicable is False: inc_watermark_failed(method, "applicability") app.logger.info( "Watermarking method %s not applicable for document %s", method, doc_id, ) return jsonify({"error": "watermarking method not applicable"}), 400 except Exception as e: inc_watermark_failed(method, "applicability_exception") app.logger.error( "Watermark applicability check failed for document %s: %s", doc_id, e ) return jsonify({"error": "watermark applicability check failed"}), 400 # apply watermark  bytes try: _wm_start = time.time() wm_bytes: bytes = WMUtils.apply_watermark( pdf=str(file_path), secret=secret, key=key, method=method, intended_for=intended_for, position=position, ) observe_watermark_duration(method, time.time() - _wm_start) if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: inc_watermark_failed(method, "empty_output") app.logger.error( "Watermarking produced no output for document %s using method %s", doc_id, method, ) return jsonify({"error": "watermarking produced no output"}), 500 except Exception as e: inc_watermark_failed(method, "exception") app.logger.error( "Watermarking failed for document %s using method %s: %s", doc_id, method, e, ) return jsonify({"error": "watermarking failed"}), 500 # build destination file name: "&lt;original_name&gt;__&lt;intended_to&gt;.pdf" base_name = Path(row.name or file_path.name).stem intended_slug = secure_filename(intended_for) dest_dir = file_path.parent / "watermarks" dest_dir.mkdir(parents=True, exist_ok=True) candidate = f"{base_name}__{intended_slug}.pdf" &gt; dest_path = dest_dir % candidate ^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for %: 'WindowsPath' and 'str' server.py:1049: TypeError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - TypeError: unsuppor... 1 failed, 13 passed, 22 warnings in 20.50s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_139"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_139_1" aria-expanded="false" aria-controls="job_list___sub_collapse_139_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_139_1"><button class="btn btn-outline-success"><span class="job_id">139 : Job ID 70821cb973b64c7fb8c4693a993f820b</span></button></div></a><div aria-labelledby="job_list___sub_heading_139_1" data-parent="#job_list___sub_accordion_139" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_139_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1211" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1211, 37), end pos: (1211, 38)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Mod, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1208,7 +1208,7 @@ storage_root = Path(app.config["STORAGE_DIR"]).resolve() file_path = Path(row.path) if not file_path.is_absolute(): - file_path = storage_root / file_path + file_path = storage_root % file_path file_path = file_path.resolve() try: file_path.relative_to(storage_root)</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e0d1a5c366ed7a13f: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.64s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_140"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_140_1" aria-expanded="false" aria-controls="job_list___sub_collapse_140_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_140_1"><button class="btn btn-outline-success"><span class="job_id">140 : Job ID 7fec96e1c380452ebca929c305bb1ee1</span></button></div></a><div aria-labelledby="job_list___sub_heading_140_1" data-parent="#job_list___sub_accordion_140" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_140_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=341" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (341, 45), end pos: (341, 46)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Pow, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -338,7 +338,7 @@ ) return jsonify({"error": "invalid filename"}), 400 - user_dir = app.config["STORAGE_DIR"] / "files" / g.user["login"] + user_dir = app.config["STORAGE_DIR"] ** "files" / g.user["login"] user_dir.mkdir(parents=True, exist_ok=True) ts = dt.datetime.now(dt.UTC).strftime("%Y%m%dT%H%M%S%fZ")</pre></div><div class="alert alert-secondary"><pre class="diff">...F.F.F.FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } &gt; resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:147: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 &gt; user_dir = app.config["STORAGE_DIR"] ** "files" / g.user["login"] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for ** or pow(): 'WindowsPath' and 'str' server.py:341: TypeError __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } &gt; upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:387: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 &gt; user_dir = app.config["STORAGE_DIR"] ** "files" / g.user["login"] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for ** or pow(): 'WindowsPath' and 'str' server.py:341: TypeError _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - TypeError: unsupport... FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - TypeError: unsupporte... FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 6 failed, 8 passed, 22 warnings in 19.47s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_141"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_141_1" aria-expanded="false" aria-controls="job_list___sub_collapse_141_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_141_1"><button class="btn btn-outline-success"><span class="job_id">141 : Job ID 7af10481af3a4bce96ac080b8b83b041</span></button></div></a><div aria-labelledby="job_list___sub_heading_141_1" data-parent="#job_list___sub_accordion_141" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_141_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=341" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (341, 55), end pos: (341, 56)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Pow, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -338,7 +338,7 @@ ) return jsonify({"error": "invalid filename"}), 400 - user_dir = app.config["STORAGE_DIR"] / "files" / g.user["login"] + user_dir = app.config["STORAGE_DIR"] / "files" ** g.user["login"] user_dir.mkdir(parents=True, exist_ok=True) ts = dt.datetime.now(dt.UTC).strftime("%Y%m%dT%H%M%S%fZ")</pre></div><div class="alert alert-secondary"><pre class="diff">...F.F.F.FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } &gt; resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:147: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 &gt; user_dir = app.config["STORAGE_DIR"] / "files" ** g.user["login"] ^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'str' server.py:341: TypeError __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } &gt; upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:387: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 &gt; user_dir = app.config["STORAGE_DIR"] / "files" ** g.user["login"] ^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'str' server.py:341: TypeError _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - TypeError: unsupport... FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - TypeError: unsupporte... FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 6 failed, 8 passed, 22 warnings in 19.36s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_142"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_142_1" aria-expanded="false" aria-controls="job_list___sub_collapse_142_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_142_1"><button class="btn btn-outline-success"><span class="job_id">142 : Job ID 9059410ea5af44b291a3597888f31e3f</span></button></div></a><div aria-labelledby="job_list___sub_heading_142_1" data-parent="#job_list___sub_accordion_142" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_142_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=350" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (350, 36), end pos: (350, 37)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Pow, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -347,7 +347,7 @@ try: # Check for path traversal attempts - stored_path = (user_dir / stored_name).resolve() + stored_path = (user_dir ** stored_name).resolve() if not str(stored_path).startswith(str(user_dir.resolve())): app.logger.warning("Upload attempt with invalid path: %s", stored_path) return jsonify({"error": "invalid path"}), 400</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: unsupported operand type(s) for ** or pow(): 'WindowsPath' and 'str' __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: unsupported operand type(s) for ** or pow(): 'WindowsPath' and 'str' _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 500 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.98s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_143"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_143_1" aria-expanded="false" aria-controls="job_list___sub_collapse_143_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_143_1"><button class="btn btn-outline-danger"><span class="job_id">143 : Job ID 6e2fffc44c5448f6afcfcf508f1e6f8e</span></button></div></a><div aria-labelledby="job_list___sub_heading_143_1" data-parent="#job_list___sub_accordion_143" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_143_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=785" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (785, 30), end pos: (785, 31)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Pow, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -782,7 +782,7 @@ storage_root = storage_root.resolve() fp = Path(p) if not fp.is_absolute(): - fp = storage_root / fp + fp = storage_root ** fp fp = fp.resolve() # Python 3.12 has is_relative_to on Path if hasattr(fp, "is_relative_to"):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.99s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_144"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_144_1" aria-expanded="false" aria-controls="job_list___sub_collapse_144_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_144_1"><button class="btn btn-outline-danger"><span class="job_id">144 : Job ID c18ce7da5f3d4c73bd5e1c10cdc12906</span></button></div></a><div aria-labelledby="job_list___sub_heading_144_1" data-parent="#job_list___sub_accordion_144" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_144_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=981" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (981, 37), end pos: (981, 38)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Pow, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -978,7 +978,7 @@ storage_root = Path(app.config["STORAGE_DIR"]).resolve() file_path = Path(row.path) if not file_path.is_absolute(): - file_path = storage_root / file_path + file_path = storage_root ** file_path file_path = file_path.resolve() try: file_path.relative_to(storage_root)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.24s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_145"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_145_1" aria-expanded="false" aria-controls="job_list___sub_collapse_145_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_145_1"><button class="btn btn-outline-success"><span class="job_id">145 : Job ID add6db1e86d64d988abb289e6c85d9ed</span></button></div></a><div aria-labelledby="job_list___sub_heading_145_1" data-parent="#job_list___sub_accordion_145" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_145_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1045" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1045, 36), end pos: (1045, 37)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Pow, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1042,7 +1042,7 @@ # build destination file name: "&lt;original_name&gt;__&lt;intended_to&gt;.pdf" base_name = Path(row.name or file_path.name).stem intended_slug = secure_filename(intended_for) - dest_dir = file_path.parent / "watermarks" + dest_dir = file_path.parent ** "watermarks" dest_dir.mkdir(parents=True, exist_ok=True) candidate = f"{base_name}__{intended_slug}.pdf"</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} &gt; resp = client.post("/api/create-watermark", json=parameters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:317: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ document_id = 1 @app.post("/api/create-watermark") @app.post("/api/create-watermark/&lt;int:document_id&gt;") @require_auth def create_watermark(document_id: int | None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on GET if not document_id: document_id = ( request.args.get("id") or request.args.get("documentid") or (request.is_json and (request.get_json(silent=True) or {}).get("id")) ) try: doc_id = document_id except (TypeError, ValueError): app.logger.warning("Invalid document id in query: %s", document_id) return jsonify({"error": "document id required"}), 400 payload = request.get_json(silent=True) or {} # allow a couple of aliases for convenience method = payload.get("method") intended_for = payload.get("intended_for") position = payload.get("position") or None secret = payload.get("secret") key = payload.get("key") # validate input try: if doc_id is None: app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id) return jsonify({"error": "document_id (int) is required"}), 400 if ( not method or not intended_for or not isinstance(secret, str) or not isinstance(key, str) ): app.logger.warning("Missing required fields for watermarking: %s", payload) return jsonify( {"error": "method, intended_for, secret, and key are required"} ), 400 # lookup the document; enforce ownership try: with get_engine().connect() as conn: row = conn.execute( text( """ SELECT id, name, path FROM Documents WHERE id = :id AND ownerid = :owner LIMIT 1 """ ), {"id": doc_id, "owner": int(g.user["id"])}, ).first() except Exception as e: app.logger.error("Database error fetching document %s", e) return jsonify({"error": "database error"}), 503 if not row: app.logger.warning( "Document not found or access denied for watermarking id=%s", doc_id ) return jsonify({"error": "document not found"}), 404 # resolve path safely under STORAGE_DIR storage_root = Path(app.config["STORAGE_DIR"]).resolve() file_path = Path(row.path) if not file_path.is_absolute(): file_path = storage_root / file_path file_path = file_path.resolve() try: file_path.relative_to(storage_root) except ValueError: app.logger.warning("Rejected document path for id %s: %s", doc_id, row.path) return jsonify({"error": "document path invalid"}), 500 if not file_path.exists(): app.logger.error("File missing on disk for document id=%s", doc_id) return jsonify({"error": "file missing on disk"}), 410 # check watermark applicability try: applicable = WMUtils.is_watermarking_applicable( method=method, pdf=str(file_path), position=position ) if applicable is False: inc_watermark_failed(method, "applicability") app.logger.info( "Watermarking method %s not applicable for document %s", method, doc_id, ) return jsonify({"error": "watermarking method not applicable"}), 400 except Exception as e: inc_watermark_failed(method, "applicability_exception") app.logger.error( "Watermark applicability check failed for document %s: %s", doc_id, e ) return jsonify({"error": "watermark applicability check failed"}), 400 # apply watermark  bytes try: _wm_start = time.time() wm_bytes: bytes = WMUtils.apply_watermark( pdf=str(file_path), secret=secret, key=key, method=method, intended_for=intended_for, position=position, ) observe_watermark_duration(method, time.time() - _wm_start) if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: inc_watermark_failed(method, "empty_output") app.logger.error( "Watermarking produced no output for document %s using method %s", doc_id, method, ) return jsonify({"error": "watermarking produced no output"}), 500 except Exception as e: inc_watermark_failed(method, "exception") app.logger.error( "Watermarking failed for document %s using method %s: %s", doc_id, method, e, ) return jsonify({"error": "watermarking failed"}), 500 # build destination file name: "&lt;original_name&gt;__&lt;intended_to&gt;.pdf" base_name = Path(row.name or file_path.name).stem intended_slug = secure_filename(intended_for) &gt; dest_dir = file_path.parent ** "watermarks" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for ** or pow(): 'WindowsPath' and 'str' server.py:1045: TypeError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - TypeError: unsuppor... 1 failed, 13 passed, 22 warnings in 20.14s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_146"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_146_1" aria-expanded="false" aria-controls="job_list___sub_collapse_146_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_146_1"><button class="btn btn-outline-success"><span class="job_id">146 : Job ID fca36a0176b34cb5b4e297b6a3c74b9a</span></button></div></a><div aria-labelledby="job_list___sub_heading_146_1" data-parent="#job_list___sub_accordion_146" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_146_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1049" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1049, 29), end pos: (1049, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Pow, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1046,7 +1046,7 @@ dest_dir.mkdir(parents=True, exist_ok=True) candidate = f"{base_name}__{intended_slug}.pdf" - dest_path = dest_dir / candidate + dest_path = dest_dir ** candidate # write bytes try:</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} &gt; resp = client.post("/api/create-watermark", json=parameters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:317: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ document_id = 1 @app.post("/api/create-watermark") @app.post("/api/create-watermark/&lt;int:document_id&gt;") @require_auth def create_watermark(document_id: int | None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on GET if not document_id: document_id = ( request.args.get("id") or request.args.get("documentid") or (request.is_json and (request.get_json(silent=True) or {}).get("id")) ) try: doc_id = document_id except (TypeError, ValueError): app.logger.warning("Invalid document id in query: %s", document_id) return jsonify({"error": "document id required"}), 400 payload = request.get_json(silent=True) or {} # allow a couple of aliases for convenience method = payload.get("method") intended_for = payload.get("intended_for") position = payload.get("position") or None secret = payload.get("secret") key = payload.get("key") # validate input try: if doc_id is None: app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id) return jsonify({"error": "document_id (int) is required"}), 400 if ( not method or not intended_for or not isinstance(secret, str) or not isinstance(key, str) ): app.logger.warning("Missing required fields for watermarking: %s", payload) return jsonify( {"error": "method, intended_for, secret, and key are required"} ), 400 # lookup the document; enforce ownership try: with get_engine().connect() as conn: row = conn.execute( text( """ SELECT id, name, path FROM Documents WHERE id = :id AND ownerid = :owner LIMIT 1 """ ), {"id": doc_id, "owner": int(g.user["id"])}, ).first() except Exception as e: app.logger.error("Database error fetching document %s", e) return jsonify({"error": "database error"}), 503 if not row: app.logger.warning( "Document not found or access denied for watermarking id=%s", doc_id ) return jsonify({"error": "document not found"}), 404 # resolve path safely under STORAGE_DIR storage_root = Path(app.config["STORAGE_DIR"]).resolve() file_path = Path(row.path) if not file_path.is_absolute(): file_path = storage_root / file_path file_path = file_path.resolve() try: file_path.relative_to(storage_root) except ValueError: app.logger.warning("Rejected document path for id %s: %s", doc_id, row.path) return jsonify({"error": "document path invalid"}), 500 if not file_path.exists(): app.logger.error("File missing on disk for document id=%s", doc_id) return jsonify({"error": "file missing on disk"}), 410 # check watermark applicability try: applicable = WMUtils.is_watermarking_applicable( method=method, pdf=str(file_path), position=position ) if applicable is False: inc_watermark_failed(method, "applicability") app.logger.info( "Watermarking method %s not applicable for document %s", method, doc_id, ) return jsonify({"error": "watermarking method not applicable"}), 400 except Exception as e: inc_watermark_failed(method, "applicability_exception") app.logger.error( "Watermark applicability check failed for document %s: %s", doc_id, e ) return jsonify({"error": "watermark applicability check failed"}), 400 # apply watermark  bytes try: _wm_start = time.time() wm_bytes: bytes = WMUtils.apply_watermark( pdf=str(file_path), secret=secret, key=key, method=method, intended_for=intended_for, position=position, ) observe_watermark_duration(method, time.time() - _wm_start) if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: inc_watermark_failed(method, "empty_output") app.logger.error( "Watermarking produced no output for document %s using method %s", doc_id, method, ) return jsonify({"error": "watermarking produced no output"}), 500 except Exception as e: inc_watermark_failed(method, "exception") app.logger.error( "Watermarking failed for document %s using method %s: %s", doc_id, method, e, ) return jsonify({"error": "watermarking failed"}), 500 # build destination file name: "&lt;original_name&gt;__&lt;intended_to&gt;.pdf" base_name = Path(row.name or file_path.name).stem intended_slug = secure_filename(intended_for) dest_dir = file_path.parent / "watermarks" dest_dir.mkdir(parents=True, exist_ok=True) candidate = f"{base_name}__{intended_slug}.pdf" &gt; dest_path = dest_dir ** candidate ^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for ** or pow(): 'WindowsPath' and 'str' server.py:1049: TypeError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - TypeError: unsuppor... 1 failed, 13 passed, 22 warnings in 20.75s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_147"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_147_1" aria-expanded="false" aria-controls="job_list___sub_collapse_147_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_147_1"><button class="btn btn-outline-danger"><span class="job_id">147 : Job ID 2a0702e8a29c45dfa13c27ee46ee9399</span></button></div></a><div aria-labelledby="job_list___sub_heading_147_1" data-parent="#job_list___sub_accordion_147" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_147_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1211" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1211, 37), end pos: (1211, 38)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Pow, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1208,7 +1208,7 @@ storage_root = Path(app.config["STORAGE_DIR"]).resolve() file_path = Path(row.path) if not file_path.is_absolute(): - file_path = storage_root / file_path + file_path = storage_root ** file_path file_path = file_path.resolve() try: file_path.relative_to(storage_root)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.27s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_148"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_148_1" aria-expanded="false" aria-controls="job_list___sub_collapse_148_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_148_1"><button class="btn btn-outline-success"><span class="job_id">148 : Job ID af634e445b6f40a981bb95d5ddfa1d9d</span></button></div></a><div aria-labelledby="job_list___sub_heading_148_1" data-parent="#job_list___sub_accordion_148" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_148_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=341" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (341, 45), end pos: (341, 46)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_RShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -338,7 +338,7 @@ ) return jsonify({"error": "invalid filename"}), 400 - user_dir = app.config["STORAGE_DIR"] / "files" / g.user["login"] + user_dir = app.config["STORAGE_DIR"] &gt;&gt; "files" / g.user["login"] user_dir.mkdir(parents=True, exist_ok=True) ts = dt.datetime.now(dt.UTC).strftime("%Y%m%dT%H%M%S%fZ")</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } &gt; resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:147: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 &gt; user_dir = app.config["STORAGE_DIR"] &gt;&gt; "files" / g.user["login"] ^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for /: 'str' and 'str' server.py:341: TypeError __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } &gt; upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:387: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 &gt; user_dir = app.config["STORAGE_DIR"] &gt;&gt; "files" / g.user["login"] ^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for /: 'str' and 'str' server.py:341: TypeError _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - TypeError: unsupport... FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - TypeError: unsupporte... FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 20.18s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_149"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_149_1" aria-expanded="false" aria-controls="job_list___sub_collapse_149_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_149_1"><button class="btn btn-outline-success"><span class="job_id">149 : Job ID 7d5aa9a322d64f759da2022702655ca6</span></button></div></a><div aria-labelledby="job_list___sub_heading_149_1" data-parent="#job_list___sub_accordion_149" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_149_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=341" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (341, 55), end pos: (341, 56)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_RShift, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -338,7 +338,7 @@ ) return jsonify({"error": "invalid filename"}), 400 - user_dir = app.config["STORAGE_DIR"] / "files" / g.user["login"] + user_dir = app.config["STORAGE_DIR"] / "files" &gt;&gt; g.user["login"] user_dir.mkdir(parents=True, exist_ok=True) ts = dt.datetime.now(dt.UTC).strftime("%Y%m%dT%H%M%S%fZ")</pre></div><div class="alert alert-secondary"><pre class="diff">...F.F.F.FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } &gt; resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:147: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 &gt; user_dir = app.config["STORAGE_DIR"] / "files" &gt;&gt; g.user["login"] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for &gt;&gt;: 'WindowsPath' and 'str' server.py:341: TypeError __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } &gt; upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:387: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 &gt; user_dir = app.config["STORAGE_DIR"] / "files" &gt;&gt; g.user["login"] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for &gt;&gt;: 'WindowsPath' and 'str' server.py:341: TypeError _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - TypeError: unsupport... FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - TypeError: unsupporte... FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 6 failed, 8 passed, 22 warnings in 19.64s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_150"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_150_1" aria-expanded="false" aria-controls="job_list___sub_collapse_150_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_150_1"><button class="btn btn-outline-success"><span class="job_id">150 : Job ID a865026b9bdc4a638a5607d81243a18d</span></button></div></a><div aria-labelledby="job_list___sub_heading_150_1" data-parent="#job_list___sub_accordion_150" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_150_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=350" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (350, 36), end pos: (350, 37)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_RShift, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -347,7 +347,7 @@ try: # Check for path traversal attempts - stored_path = (user_dir / stored_name).resolve() + stored_path = (user_dir &gt;&gt; stored_name).resolve() if not str(stored_path).startswith(str(user_dir.resolve())): app.logger.warning("Upload attempt with invalid path: %s", stored_path) return jsonify({"error": "invalid path"}), 400</pre></div><div class="alert alert-secondary"><pre class="diff">...F.F.F.FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: unsupported operand type(s) for &gt;&gt;: 'WindowsPath' and 'str' __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: unsupported operand type(s) for &gt;&gt;: 'WindowsPath' and 'str' _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - assert 500 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 6 failed, 8 passed, 22 warnings in 19.32s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_151"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_151_1" aria-expanded="false" aria-controls="job_list___sub_collapse_151_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_151_1"><button class="btn btn-outline-danger"><span class="job_id">151 : Job ID 1dba1411d81549d783f15ff51f8949e0</span></button></div></a><div aria-labelledby="job_list___sub_heading_151_1" data-parent="#job_list___sub_accordion_151" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_151_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=785" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (785, 30), end pos: (785, 31)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_RShift, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -782,7 +782,7 @@ storage_root = storage_root.resolve() fp = Path(p) if not fp.is_absolute(): - fp = storage_root / fp + fp = storage_root &gt;&gt; fp fp = fp.resolve() # Python 3.12 has is_relative_to on Path if hasattr(fp, "is_relative_to"):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.38s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_152"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_152_1" aria-expanded="false" aria-controls="job_list___sub_collapse_152_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_152_1"><button class="btn btn-outline-danger"><span class="job_id">152 : Job ID 5fe08875218140cab1e08f601623f358</span></button></div></a><div aria-labelledby="job_list___sub_heading_152_1" data-parent="#job_list___sub_accordion_152" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_152_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=981" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (981, 37), end pos: (981, 38)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_RShift, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -978,7 +978,7 @@ storage_root = Path(app.config["STORAGE_DIR"]).resolve() file_path = Path(row.path) if not file_path.is_absolute(): - file_path = storage_root / file_path + file_path = storage_root &gt;&gt; file_path file_path = file_path.resolve() try: file_path.relative_to(storage_root)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.49s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_153"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_153_1" aria-expanded="false" aria-controls="job_list___sub_collapse_153_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_153_1"><button class="btn btn-outline-success"><span class="job_id">153 : Job ID cedbcf6fb10e451ebe95a6f7c856a426</span></button></div></a><div aria-labelledby="job_list___sub_heading_153_1" data-parent="#job_list___sub_accordion_153" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_153_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1045" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1045, 36), end pos: (1045, 37)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_RShift, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1042,7 +1042,7 @@ # build destination file name: "&lt;original_name&gt;__&lt;intended_to&gt;.pdf" base_name = Path(row.name or file_path.name).stem intended_slug = secure_filename(intended_for) - dest_dir = file_path.parent / "watermarks" + dest_dir = file_path.parent &gt;&gt; "watermarks" dest_dir.mkdir(parents=True, exist_ok=True) candidate = f"{base_name}__{intended_slug}.pdf"</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T200137592728Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T200138534820Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.82s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_154"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_154_1" aria-expanded="false" aria-controls="job_list___sub_collapse_154_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_154_1"><button class="btn btn-outline-success"><span class="job_id">154 : Job ID 3cbb130abd8d48aaa1a8c540d5ac5c36</span></button></div></a><div aria-labelledby="job_list___sub_heading_154_1" data-parent="#job_list___sub_accordion_154" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_154_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1049" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1049, 29), end pos: (1049, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_RShift, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1046,7 +1046,7 @@ dest_dir.mkdir(parents=True, exist_ok=True) candidate = f"{base_name}__{intended_slug}.pdf" - dest_path = dest_dir / candidate + dest_path = dest_dir &gt;&gt; candidate # write bytes try:</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%]</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_155"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_155_1" aria-expanded="false" aria-controls="job_list___sub_collapse_155_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_155_1"><button class="btn btn-outline-danger"><span class="job_id">155 : Job ID df35137d704a4f52a0f6b0f5abd85290</span></button></div></a><div aria-labelledby="job_list___sub_heading_155_1" data-parent="#job_list___sub_accordion_155" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_155_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1211" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1211, 37), end pos: (1211, 38)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_RShift, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1208,7 +1208,7 @@ storage_root = Path(app.config["STORAGE_DIR"]).resolve() file_path = Path(row.path) if not file_path.is_absolute(): - file_path = storage_root / file_path + file_path = storage_root &gt;&gt; file_path file_path = file_path.resolve() try: file_path.relative_to(storage_root)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.46s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_156"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_156_1" aria-expanded="false" aria-controls="job_list___sub_collapse_156_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_156_1"><button class="btn btn-outline-success"><span class="job_id">156 : Job ID 462d694cfebf471783060da8ad10393a</span></button></div></a><div aria-labelledby="job_list___sub_heading_156_1" data-parent="#job_list___sub_accordion_156" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_156_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=341" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (341, 45), end pos: (341, 46)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_LShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -338,7 +338,7 @@ ) return jsonify({"error": "invalid filename"}), 400 - user_dir = app.config["STORAGE_DIR"] / "files" / g.user["login"] + user_dir = app.config["STORAGE_DIR"] &lt;&lt; "files" / g.user["login"] user_dir.mkdir(parents=True, exist_ok=True) ts = dt.datetime.now(dt.UTC).strftime("%Y%m%dT%H%M%S%fZ")</pre></div><div class="alert alert-secondary"><pre class="diff">...F.F.F.FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } &gt; resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:147: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 &gt; user_dir = app.config["STORAGE_DIR"] &lt;&lt; "files" / g.user["login"] ^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for /: 'str' and 'str' server.py:341: TypeError __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } &gt; upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:387: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 &gt; user_dir = app.config["STORAGE_DIR"] &lt;&lt; "files" / g.user["login"] ^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for /: 'str' and 'str' server.py:341: TypeError _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - TypeError: unsupport... FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - TypeError: unsupporte... FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 6 failed, 8 passed, 22 warnings in 19.64s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_157"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_157_1" aria-expanded="false" aria-controls="job_list___sub_collapse_157_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_157_1"><button class="btn btn-outline-success"><span class="job_id">157 : Job ID ef3acae16469403dbc2946fb0591bad3</span></button></div></a><div aria-labelledby="job_list___sub_heading_157_1" data-parent="#job_list___sub_accordion_157" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_157_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=341" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (341, 55), end pos: (341, 56)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_LShift, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -338,7 +338,7 @@ ) return jsonify({"error": "invalid filename"}), 400 - user_dir = app.config["STORAGE_DIR"] / "files" / g.user["login"] + user_dir = app.config["STORAGE_DIR"] / "files" &lt;&lt; g.user["login"] user_dir.mkdir(parents=True, exist_ok=True) ts = dt.datetime.now(dt.UTC).strftime("%Y%m%dT%H%M%S%fZ")</pre></div><div class="alert alert-secondary"><pre class="diff">...F.F.F.FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } &gt; resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:147: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 &gt; user_dir = app.config["STORAGE_DIR"] / "files" &lt;&lt; g.user["login"] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for &lt;&lt;: 'WindowsPath' and 'str' server.py:341: TypeError __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } &gt; upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:387: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 &gt; user_dir = app.config["STORAGE_DIR"] / "files" &lt;&lt; g.user["login"] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for &lt;&lt;: 'WindowsPath' and 'str' server.py:341: TypeError _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - TypeError: unsupport... FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - TypeError: unsupporte... FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 6 failed, 8 passed, 22 warnings in 19.79s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_158"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_158_1" aria-expanded="false" aria-controls="job_list___sub_collapse_158_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_158_1"><button class="btn btn-outline-success"><span class="job_id">158 : Job ID fe9c26797200429a979682a90aae9441</span></button></div></a><div aria-labelledby="job_list___sub_heading_158_1" data-parent="#job_list___sub_accordion_158" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_158_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=350" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (350, 36), end pos: (350, 37)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_LShift, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -347,7 +347,7 @@ try: # Check for path traversal attempts - stored_path = (user_dir / stored_name).resolve() + stored_path = (user_dir &lt;&lt; stored_name).resolve() if not str(stored_path).startswith(str(user_dir.resolve())): app.logger.warning("Upload attempt with invalid path: %s", stored_path) return jsonify({"error": "invalid path"}), 400</pre></div><div class="alert alert-secondary"><pre class="diff">...F.F.F.FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: unsupported operand type(s) for &lt;&lt;: 'WindowsPath' and 'str' __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: unsupported operand type(s) for &lt;&lt;: 'WindowsPath' and 'str' _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - assert 500 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 6 failed, 8 passed, 22 warnings in 19.32s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_159"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_159_1" aria-expanded="false" aria-controls="job_list___sub_collapse_159_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_159_1"><button class="btn btn-outline-danger"><span class="job_id">159 : Job ID 1531bcb31b7c48409ebfb7fa81081a2f</span></button></div></a><div aria-labelledby="job_list___sub_heading_159_1" data-parent="#job_list___sub_accordion_159" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_159_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=785" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (785, 30), end pos: (785, 31)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_LShift, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -782,7 +782,7 @@ storage_root = storage_root.resolve() fp = Path(p) if not fp.is_absolute(): - fp = storage_root / fp + fp = storage_root &lt;&lt; fp fp = fp.resolve() # Python 3.12 has is_relative_to on Path if hasattr(fp, "is_relative_to"):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.19s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_160"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_160_1" aria-expanded="false" aria-controls="job_list___sub_collapse_160_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_160_1"><button class="btn btn-outline-success"><span class="job_id">160 : Job ID 062c13a1f9cd4cdd8d44e0044324588c</span></button></div></a><div aria-labelledby="job_list___sub_heading_160_1" data-parent="#job_list___sub_accordion_160" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_160_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=981" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (981, 37), end pos: (981, 38)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_LShift, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -978,7 +978,7 @@ storage_root = Path(app.config["STORAGE_DIR"]).resolve() file_path = Path(row.path) if not file_path.is_absolute(): - file_path = storage_root / file_path + file_path = storage_root &lt;&lt; file_path file_path = file_path.resolve() try: file_path.relative_to(storage_root)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T182428926754Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T182430081237Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 20.50s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_161"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_161_1" aria-expanded="false" aria-controls="job_list___sub_collapse_161_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_161_1"><button class="btn btn-outline-success"><span class="job_id">161 : Job ID 7a659fb4bf5e4d179c1b389183420b66</span></button></div></a><div aria-labelledby="job_list___sub_heading_161_1" data-parent="#job_list___sub_accordion_161" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_161_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1045" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1045, 36), end pos: (1045, 37)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_LShift, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1042,7 +1042,7 @@ # build destination file name: "&lt;original_name&gt;__&lt;intended_to&gt;.pdf" base_name = Path(row.name or file_path.name).stem intended_slug = secure_filename(intended_for) - dest_dir = file_path.parent / "watermarks" + dest_dir = file_path.parent &lt;&lt; "watermarks" dest_dir.mkdir(parents=True, exist_ok=True) candidate = f"{base_name}__{intended_slug}.pdf"</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T051745848196Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T051746811592Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.74s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_162"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_162_1" aria-expanded="false" aria-controls="job_list___sub_collapse_162_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_162_1"><button class="btn btn-outline-success"><span class="job_id">162 : Job ID ded3e53acf5e439b894bd05b7c6952f7</span></button></div></a><div aria-labelledby="job_list___sub_heading_162_1" data-parent="#job_list___sub_accordion_162" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_162_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1049" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1049, 29), end pos: (1049, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_LShift, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1046,7 +1046,7 @@ dest_dir.mkdir(parents=True, exist_ok=True) candidate = f"{base_name}__{intended_slug}.pdf" - dest_path = dest_dir / candidate + dest_path = dest_dir &lt;&lt; candidate # write bytes try:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T035048357316Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T035049260875Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.91s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_163"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_163_1" aria-expanded="false" aria-controls="job_list___sub_collapse_163_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_163_1"><button class="btn btn-outline-success"><span class="job_id">163 : Job ID 37af8973b4804038922bcf1186dd399a</span></button></div></a><div aria-labelledby="job_list___sub_heading_163_1" data-parent="#job_list___sub_accordion_163" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_163_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1211" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1211, 37), end pos: (1211, 38)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_LShift, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1208,7 +1208,7 @@ storage_root = Path(app.config["STORAGE_DIR"]).resolve() file_path = Path(row.path) if not file_path.is_absolute(): - file_path = storage_root / file_path + file_path = storage_root &lt;&lt; file_path file_path = file_path.resolve() try: file_path.relative_to(storage_root)</pre></div><div class="alert alert-secondary"><pre class="diff">...F.......... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:228: in open request = self._request_from_builder_args(args, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:200: in _request_from_builder_args return builder.get_request() ^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:764: in get_request return cls(self.get_environ()) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:688: in get_environ input_stream, content_length, boundary = stream_encode_multipart( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:130: in stream_encode_multipart write_binary(encoder.send_event(Data(data=chunk, more_data=True))) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:81: in write_binary return stream.write(s) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... 1 failed, 13 passed, 22 warnings in 21.35s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_164"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_164_1" aria-expanded="false" aria-controls="job_list___sub_collapse_164_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_164_1"><button class="btn btn-outline-success"><span class="job_id">164 : Job ID 0f7c1958ba764d4d9a5637a4af279fa8</span></button></div></a><div aria-labelledby="job_list___sub_heading_164_1" data-parent="#job_list___sub_accordion_164" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_164_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=341" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (341, 45), end pos: (341, 46)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitOr, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -338,7 +338,7 @@ ) return jsonify({"error": "invalid filename"}), 400 - user_dir = app.config["STORAGE_DIR"] / "files" / g.user["login"] + user_dir = app.config["STORAGE_DIR"] | "files" / g.user["login"] user_dir.mkdir(parents=True, exist_ok=True) ts = dt.datetime.now(dt.UTC).strftime("%Y%m%dT%H%M%S%fZ")</pre></div><div class="alert alert-secondary"><pre class="diff">...F.F.F.FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } &gt; resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:147: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 &gt; user_dir = app.config["STORAGE_DIR"] | "files" / g.user["login"] ^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for /: 'str' and 'str' server.py:341: TypeError __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } &gt; upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:387: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 &gt; user_dir = app.config["STORAGE_DIR"] | "files" / g.user["login"] ^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for /: 'str' and 'str' server.py:341: TypeError _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - TypeError: unsupport... FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - TypeError: unsupporte... FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 6 failed, 8 passed, 22 warnings in 19.94s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_165"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_165_1" aria-expanded="false" aria-controls="job_list___sub_collapse_165_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_165_1"><button class="btn btn-outline-success"><span class="job_id">165 : Job ID 48909b82d0414769bc0c8fef815826e5</span></button></div></a><div aria-labelledby="job_list___sub_heading_165_1" data-parent="#job_list___sub_accordion_165" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_165_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=341" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (341, 55), end pos: (341, 56)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitOr, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -338,7 +338,7 @@ ) return jsonify({"error": "invalid filename"}), 400 - user_dir = app.config["STORAGE_DIR"] / "files" / g.user["login"] + user_dir = app.config["STORAGE_DIR"] / "files" | g.user["login"] user_dir.mkdir(parents=True, exist_ok=True) ts = dt.datetime.now(dt.UTC).strftime("%Y%m%dT%H%M%S%fZ")</pre></div><div class="alert alert-secondary"><pre class="diff">...F.F.F.FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } &gt; resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:147: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 &gt; user_dir = app.config["STORAGE_DIR"] / "files" | g.user["login"] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for |: 'WindowsPath' and 'str' server.py:341: TypeError __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } &gt; upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:387: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 &gt; user_dir = app.config["STORAGE_DIR"] / "files" | g.user["login"] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for |: 'WindowsPath' and 'str' server.py:341: TypeError _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - TypeError: unsupport... FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - TypeError: unsupporte... FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 6 failed, 8 passed, 22 warnings in 19.30s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_166"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_166_1" aria-expanded="false" aria-controls="job_list___sub_collapse_166_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_166_1"><button class="btn btn-outline-success"><span class="job_id">166 : Job ID 00fbd1520e8b40098c133948f7ef919d</span></button></div></a><div aria-labelledby="job_list___sub_heading_166_1" data-parent="#job_list___sub_accordion_166" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_166_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=350" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (350, 36), end pos: (350, 37)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitOr, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -347,7 +347,7 @@ try: # Check for path traversal attempts - stored_path = (user_dir / stored_name).resolve() + stored_path = (user_dir | stored_name).resolve() if not str(stored_path).startswith(str(user_dir.resolve())): app.logger.warning("Upload attempt with invalid path: %s", stored_path) return jsonify({"error": "invalid path"}), 400</pre></div><div class="alert alert-secondary"><pre class="diff">...F.F.F.FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: unsupported operand type(s) for |: 'WindowsPath' and 'str' __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: unsupported operand type(s) for |: 'WindowsPath' and 'str' _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - assert 500 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 6 failed, 8 passed, 22 warnings in 19.19s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_167"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_167_1" aria-expanded="false" aria-controls="job_list___sub_collapse_167_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_167_1"><button class="btn btn-outline-danger"><span class="job_id">167 : Job ID 247bcdef5d7041c0a58d649faf5987cb</span></button></div></a><div aria-labelledby="job_list___sub_heading_167_1" data-parent="#job_list___sub_accordion_167" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_167_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=785" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (785, 30), end pos: (785, 31)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitOr, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -782,7 +782,7 @@ storage_root = storage_root.resolve() fp = Path(p) if not fp.is_absolute(): - fp = storage_root / fp + fp = storage_root | fp fp = fp.resolve() # Python 3.12 has is_relative_to on Path if hasattr(fp, "is_relative_to"):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.13s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_168"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_168_1" aria-expanded="false" aria-controls="job_list___sub_collapse_168_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_168_1"><button class="btn btn-outline-danger"><span class="job_id">168 : Job ID de5f3ae7a94e41a5ab3fbd79fd2a2a70</span></button></div></a><div aria-labelledby="job_list___sub_heading_168_1" data-parent="#job_list___sub_accordion_168" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_168_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=981" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (981, 37), end pos: (981, 38)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitOr, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -978,7 +978,7 @@ storage_root = Path(app.config["STORAGE_DIR"]).resolve() file_path = Path(row.path) if not file_path.is_absolute(): - file_path = storage_root / file_path + file_path = storage_root | file_path file_path = file_path.resolve() try: file_path.relative_to(storage_root)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.43s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_169"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_169_1" aria-expanded="false" aria-controls="job_list___sub_collapse_169_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_169_1"><button class="btn btn-outline-success"><span class="job_id">169 : Job ID c8cf61ec7d0e443dac9d96ea5de31c5a</span></button></div></a><div aria-labelledby="job_list___sub_heading_169_1" data-parent="#job_list___sub_accordion_169" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_169_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1045" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1045, 36), end pos: (1045, 37)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitOr, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1042,7 +1042,7 @@ # build destination file name: "&lt;original_name&gt;__&lt;intended_to&gt;.pdf" base_name = Path(row.name or file_path.name).stem intended_slug = secure_filename(intended_for) - dest_dir = file_path.parent / "watermarks" + dest_dir = file_path.parent | "watermarks" dest_dir.mkdir(parents=True, exist_ok=True) candidate = f"{base_name}__{intended_slug}.pdf"</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....F.... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:228: in open request = self._request_from_builder_args(args, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:200: in _request_from_builder_args return builder.get_request() ^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:764: in get_request return cls(self.get_environ()) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:688: in get_environ input_stream, content_length, boundary = stream_encode_multipart( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:130: in stream_encode_multipart write_binary(encoder.send_event(Data(data=chunk, more_data=True))) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:81: in write_binary return stream.write(s) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} &gt; resp = client.post("/api/create-watermark", json=parameters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:317: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ document_id = 1 @app.post("/api/create-watermark") @app.post("/api/create-watermark/&lt;int:document_id&gt;") @require_auth def create_watermark(document_id: int | None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on GET if not document_id: document_id = ( request.args.get("id") or request.args.get("documentid") or (request.is_json and (request.get_json(silent=True) or {}).get("id")) ) try: doc_id = document_id except (TypeError, ValueError): app.logger.warning("Invalid document id in query: %s", document_id) return jsonify({"error": "document id required"}), 400 payload = request.get_json(silent=True) or {} # allow a couple of aliases for convenience method = payload.get("method") intended_for = payload.get("intended_for") position = payload.get("position") or None secret = payload.get("secret") key = payload.get("key") # validate input try: if doc_id is None: app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id) return jsonify({"error": "document_id (int) is required"}), 400 if ( not method or not intended_for or not isinstance(secret, str) or not isinstance(key, str) ): app.logger.warning("Missing required fields for watermarking: %s", payload) return jsonify( {"error": "method, intended_for, secret, and key are required"} ), 400 # lookup the document; enforce ownership try: with get_engine().connect() as conn: row = conn.execute( text( """ SELECT id, name, path FROM Documents WHERE id = :id AND ownerid = :owner LIMIT 1 """ ), {"id": doc_id, "owner": int(g.user["id"])}, ).first() except Exception as e: app.logger.error("Database error fetching document %s", e) return jsonify({"error": "database error"}), 503 if not row: app.logger.warning( "Document not found or access denied for watermarking id=%s", doc_id ) return jsonify({"error": "document not found"}), 404 # resolve path safely under STORAGE_DIR storage_root = Path(app.config["STORAGE_DIR"]).resolve() file_path = Path(row.path) if not file_path.is_absolute(): file_path = storage_root / file_path file_path = file_path.resolve() try: file_path.relative_to(storage_root) except ValueError: app.logger.warning("Rejected document path for id %s: %s", doc_id, row.path) return jsonify({"error": "document path invalid"}), 500 if not file_path.exists(): app.logger.error("File missing on disk for document id=%s", doc_id) return jsonify({"error": "file missing on disk"}), 410 # check watermark applicability try: applicable = WMUtils.is_watermarking_applicable( method=method, pdf=str(file_path), position=position ) if applicable is False: inc_watermark_failed(method, "applicability") app.logger.info( "Watermarking method %s not applicable for document %s", method, doc_id, ) return jsonify({"error": "watermarking method not applicable"}), 400 except Exception as e: inc_watermark_failed(method, "applicability_exception") app.logger.error( "Watermark applicability check failed for document %s: %s", doc_id, e ) return jsonify({"error": "watermark applicability check failed"}), 400 # apply watermark  bytes try: _wm_start = time.time() wm_bytes: bytes = WMUtils.apply_watermark( pdf=str(file_path), secret=secret, key=key, method=method, intended_for=intended_for, position=position, ) observe_watermark_duration(method, time.time() - _wm_start) if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: inc_watermark_failed(method, "empty_output") app.logger.error( "Watermarking produced no output for document %s using method %s", doc_id, method, ) return jsonify({"error": "watermarking produced no output"}), 500 except Exception as e: inc_watermark_failed(method, "exception") app.logger.error( "Watermarking failed for document %s using method %s: %s", doc_id, method, e, ) return jsonify({"error": "watermarking failed"}), 500 # build destination file name: "&lt;original_name&gt;__&lt;intended_to&gt;.pdf" base_name = Path(row.name or file_path.name).stem intended_slug = secure_filename(intended_for) &gt; dest_dir = file_path.parent | "watermarks" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for |: 'WindowsPath' and 'str' server.py:1045: TypeError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - TypeError: unsuppor... 2 failed, 12 passed, 22 warnings in 20.04s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_170"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_170_1" aria-expanded="false" aria-controls="job_list___sub_collapse_170_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_170_1"><button class="btn btn-outline-success"><span class="job_id">170 : Job ID 8553bce2e4fa4a9f8ee886d3cadd2862</span></button></div></a><div aria-labelledby="job_list___sub_heading_170_1" data-parent="#job_list___sub_accordion_170" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_170_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1049" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1049, 29), end pos: (1049, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitOr, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1046,7 +1046,7 @@ dest_dir.mkdir(parents=True, exist_ok=True) candidate = f"{base_name}__{intended_slug}.pdf" - dest_path = dest_dir / candidate + dest_path = dest_dir | candidate # write bytes try:</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} &gt; resp = client.post("/api/create-watermark", json=parameters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:317: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ document_id = 1 @app.post("/api/create-watermark") @app.post("/api/create-watermark/&lt;int:document_id&gt;") @require_auth def create_watermark(document_id: int | None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on GET if not document_id: document_id = ( request.args.get("id") or request.args.get("documentid") or (request.is_json and (request.get_json(silent=True) or {}).get("id")) ) try: doc_id = document_id except (TypeError, ValueError): app.logger.warning("Invalid document id in query: %s", document_id) return jsonify({"error": "document id required"}), 400 payload = request.get_json(silent=True) or {} # allow a couple of aliases for convenience method = payload.get("method") intended_for = payload.get("intended_for") position = payload.get("position") or None secret = payload.get("secret") key = payload.get("key") # validate input try: if doc_id is None: app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id) return jsonify({"error": "document_id (int) is required"}), 400 if ( not method or not intended_for or not isinstance(secret, str) or not isinstance(key, str) ): app.logger.warning("Missing required fields for watermarking: %s", payload) return jsonify( {"error": "method, intended_for, secret, and key are required"} ), 400 # lookup the document; enforce ownership try: with get_engine().connect() as conn: row = conn.execute( text( """ SELECT id, name, path FROM Documents WHERE id = :id AND ownerid = :owner LIMIT 1 """ ), {"id": doc_id, "owner": int(g.user["id"])}, ).first() except Exception as e: app.logger.error("Database error fetching document %s", e) return jsonify({"error": "database error"}), 503 if not row: app.logger.warning( "Document not found or access denied for watermarking id=%s", doc_id ) return jsonify({"error": "document not found"}), 404 # resolve path safely under STORAGE_DIR storage_root = Path(app.config["STORAGE_DIR"]).resolve() file_path = Path(row.path) if not file_path.is_absolute(): file_path = storage_root / file_path file_path = file_path.resolve() try: file_path.relative_to(storage_root) except ValueError: app.logger.warning("Rejected document path for id %s: %s", doc_id, row.path) return jsonify({"error": "document path invalid"}), 500 if not file_path.exists(): app.logger.error("File missing on disk for document id=%s", doc_id) return jsonify({"error": "file missing on disk"}), 410 # check watermark applicability try: applicable = WMUtils.is_watermarking_applicable( method=method, pdf=str(file_path), position=position ) if applicable is False: inc_watermark_failed(method, "applicability") app.logger.info( "Watermarking method %s not applicable for document %s", method, doc_id, ) return jsonify({"error": "watermarking method not applicable"}), 400 except Exception as e: inc_watermark_failed(method, "applicability_exception") app.logger.error( "Watermark applicability check failed for document %s: %s", doc_id, e ) return jsonify({"error": "watermark applicability check failed"}), 400 # apply watermark  bytes try: _wm_start = time.time() wm_bytes: bytes = WMUtils.apply_watermark( pdf=str(file_path), secret=secret, key=key, method=method, intended_for=intended_for, position=position, ) observe_watermark_duration(method, time.time() - _wm_start) if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: inc_watermark_failed(method, "empty_output") app.logger.error( "Watermarking produced no output for document %s using method %s", doc_id, method, ) return jsonify({"error": "watermarking produced no output"}), 500 except Exception as e: inc_watermark_failed(method, "exception") app.logger.error( "Watermarking failed for document %s using method %s: %s", doc_id, method, e, ) return jsonify({"error": "watermarking failed"}), 500 # build destination file name: "&lt;original_name&gt;__&lt;intended_to&gt;.pdf" base_name = Path(row.name or file_path.name).stem intended_slug = secure_filename(intended_for) dest_dir = file_path.parent / "watermarks" dest_dir.mkdir(parents=True, exist_ok=True) candidate = f"{base_name}__{intended_slug}.pdf" &gt; dest_path = dest_dir | candidate ^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for |: 'WindowsPath' and 'str' server.py:1049: TypeError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - TypeError: unsuppor... 1 failed, 13 passed, 22 warnings in 20.49s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_171"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_171_1" aria-expanded="false" aria-controls="job_list___sub_collapse_171_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_171_1"><button class="btn btn-outline-danger"><span class="job_id">171 : Job ID 0b29a8a06f8b45fd80085f06d5eb4f7a</span></button></div></a><div aria-labelledby="job_list___sub_heading_171_1" data-parent="#job_list___sub_accordion_171" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_171_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1211" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1211, 37), end pos: (1211, 38)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitOr, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1208,7 +1208,7 @@ storage_root = Path(app.config["STORAGE_DIR"]).resolve() file_path = Path(row.path) if not file_path.is_absolute(): - file_path = storage_root / file_path + file_path = storage_root | file_path file_path = file_path.resolve() try: file_path.relative_to(storage_root)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.16s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_172"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_172_1" aria-expanded="false" aria-controls="job_list___sub_collapse_172_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_172_1"><button class="btn btn-outline-success"><span class="job_id">172 : Job ID 1d5f7c5f64294c6f9580eed3041f287e</span></button></div></a><div aria-labelledby="job_list___sub_heading_172_1" data-parent="#job_list___sub_accordion_172" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_172_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=341" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (341, 45), end pos: (341, 46)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitAnd, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -338,7 +338,7 @@ ) return jsonify({"error": "invalid filename"}), 400 - user_dir = app.config["STORAGE_DIR"] / "files" / g.user["login"] + user_dir = app.config["STORAGE_DIR"] &amp; "files" / g.user["login"] user_dir.mkdir(parents=True, exist_ok=True) ts = dt.datetime.now(dt.UTC).strftime("%Y%m%dT%H%M%S%fZ")</pre></div><div class="alert alert-secondary"><pre class="diff">...F.F.F.FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } &gt; resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:147: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 &gt; user_dir = app.config["STORAGE_DIR"] &amp; "files" / g.user["login"] ^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for /: 'str' and 'str' server.py:341: TypeError __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } &gt; upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:387: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 &gt; user_dir = app.config["STORAGE_DIR"] &amp; "files" / g.user["login"] ^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for /: 'str' and 'str' server.py:341: TypeError _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - TypeError: unsupport... FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - TypeError: unsupporte... FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 6 failed, 8 passed, 22 warnings in 19.38s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_173"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_173_1" aria-expanded="false" aria-controls="job_list___sub_collapse_173_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_173_1"><button class="btn btn-outline-success"><span class="job_id">173 : Job ID 46ddbc73f2ca452cbe2deca3919935d5</span></button></div></a><div aria-labelledby="job_list___sub_heading_173_1" data-parent="#job_list___sub_accordion_173" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_173_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=341" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (341, 55), end pos: (341, 56)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitAnd, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -338,7 +338,7 @@ ) return jsonify({"error": "invalid filename"}), 400 - user_dir = app.config["STORAGE_DIR"] / "files" / g.user["login"] + user_dir = app.config["STORAGE_DIR"] / "files" &amp; g.user["login"] user_dir.mkdir(parents=True, exist_ok=True) ts = dt.datetime.now(dt.UTC).strftime("%Y%m%dT%H%M%S%fZ")</pre></div><div class="alert alert-secondary"><pre class="diff">...F.F.F.FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } &gt; resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:147: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 &gt; user_dir = app.config["STORAGE_DIR"] / "files" &amp; g.user["login"] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for &amp;: 'WindowsPath' and 'str' server.py:341: TypeError __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } &gt; upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:387: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 &gt; user_dir = app.config["STORAGE_DIR"] / "files" &amp; g.user["login"] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for &amp;: 'WindowsPath' and 'str' server.py:341: TypeError _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - TypeError: unsupport... FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - TypeError: unsupporte... FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 6 failed, 8 passed, 22 warnings in 20.44s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_174"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_174_1" aria-expanded="false" aria-controls="job_list___sub_collapse_174_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_174_1"><button class="btn btn-outline-success"><span class="job_id">174 : Job ID 89477182c03c48909ea394c93ba6f8cb</span></button></div></a><div aria-labelledby="job_list___sub_heading_174_1" data-parent="#job_list___sub_accordion_174" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_174_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=350" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (350, 36), end pos: (350, 37)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitAnd, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -347,7 +347,7 @@ try: # Check for path traversal attempts - stored_path = (user_dir / stored_name).resolve() + stored_path = (user_dir &amp; stored_name).resolve() if not str(stored_path).startswith(str(user_dir.resolve())): app.logger.warning("Upload attempt with invalid path: %s", stored_path) return jsonify({"error": "invalid path"}), 400</pre></div><div class="alert alert-secondary"><pre class="diff">...F.F.F.FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: unsupported operand type(s) for &amp;: 'WindowsPath' and 'str' __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: unsupported operand type(s) for &amp;: 'WindowsPath' and 'str' _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - assert 500 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 6 failed, 8 passed, 22 warnings in 21.31s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_175"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_175_1" aria-expanded="false" aria-controls="job_list___sub_collapse_175_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_175_1"><button class="btn btn-outline-danger"><span class="job_id">175 : Job ID cafbbddc4b9b45178a2b3c83eb5db374</span></button></div></a><div aria-labelledby="job_list___sub_heading_175_1" data-parent="#job_list___sub_accordion_175" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_175_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=785" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (785, 30), end pos: (785, 31)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitAnd, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -782,7 +782,7 @@ storage_root = storage_root.resolve() fp = Path(p) if not fp.is_absolute(): - fp = storage_root / fp + fp = storage_root &amp; fp fp = fp.resolve() # Python 3.12 has is_relative_to on Path if hasattr(fp, "is_relative_to"):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.29s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_176"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_176_1" aria-expanded="false" aria-controls="job_list___sub_collapse_176_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_176_1"><button class="btn btn-outline-danger"><span class="job_id">176 : Job ID 9dec67571d024459943c7ed52a9fb77b</span></button></div></a><div aria-labelledby="job_list___sub_heading_176_1" data-parent="#job_list___sub_accordion_176" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_176_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=981" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (981, 37), end pos: (981, 38)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitAnd, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -978,7 +978,7 @@ storage_root = Path(app.config["STORAGE_DIR"]).resolve() file_path = Path(row.path) if not file_path.is_absolute(): - file_path = storage_root / file_path + file_path = storage_root &amp; file_path file_path = file_path.resolve() try: file_path.relative_to(storage_root)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.75s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_177"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_177_1" aria-expanded="false" aria-controls="job_list___sub_collapse_177_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_177_1"><button class="btn btn-outline-success"><span class="job_id">177 : Job ID 9c35ba0d11294d75a24b81f825a43398</span></button></div></a><div aria-labelledby="job_list___sub_heading_177_1" data-parent="#job_list___sub_accordion_177" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_177_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1045" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1045, 36), end pos: (1045, 37)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitAnd, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1042,7 +1042,7 @@ # build destination file name: "&lt;original_name&gt;__&lt;intended_to&gt;.pdf" base_name = Path(row.name or file_path.name).stem intended_slug = secure_filename(intended_for) - dest_dir = file_path.parent / "watermarks" + dest_dir = file_path.parent &amp; "watermarks" dest_dir.mkdir(parents=True, exist_ok=True) candidate = f"{base_name}__{intended_slug}.pdf"</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} &gt; resp = client.post("/api/create-watermark", json=parameters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:317: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ document_id = 1 @app.post("/api/create-watermark") @app.post("/api/create-watermark/&lt;int:document_id&gt;") @require_auth def create_watermark(document_id: int | None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on GET if not document_id: document_id = ( request.args.get("id") or request.args.get("documentid") or (request.is_json and (request.get_json(silent=True) or {}).get("id")) ) try: doc_id = document_id except (TypeError, ValueError): app.logger.warning("Invalid document id in query: %s", document_id) return jsonify({"error": "document id required"}), 400 payload = request.get_json(silent=True) or {} # allow a couple of aliases for convenience method = payload.get("method") intended_for = payload.get("intended_for") position = payload.get("position") or None secret = payload.get("secret") key = payload.get("key") # validate input try: if doc_id is None: app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id) return jsonify({"error": "document_id (int) is required"}), 400 if ( not method or not intended_for or not isinstance(secret, str) or not isinstance(key, str) ): app.logger.warning("Missing required fields for watermarking: %s", payload) return jsonify( {"error": "method, intended_for, secret, and key are required"} ), 400 # lookup the document; enforce ownership try: with get_engine().connect() as conn: row = conn.execute( text( """ SELECT id, name, path FROM Documents WHERE id = :id AND ownerid = :owner LIMIT 1 """ ), {"id": doc_id, "owner": int(g.user["id"])}, ).first() except Exception as e: app.logger.error("Database error fetching document %s", e) return jsonify({"error": "database error"}), 503 if not row: app.logger.warning( "Document not found or access denied for watermarking id=%s", doc_id ) return jsonify({"error": "document not found"}), 404 # resolve path safely under STORAGE_DIR storage_root = Path(app.config["STORAGE_DIR"]).resolve() file_path = Path(row.path) if not file_path.is_absolute(): file_path = storage_root / file_path file_path = file_path.resolve() try: file_path.relative_to(storage_root) except ValueError: app.logger.warning("Rejected document path for id %s: %s", doc_id, row.path) return jsonify({"error": "document path invalid"}), 500 if not file_path.exists(): app.logger.error("File missing on disk for document id=%s", doc_id) return jsonify({"error": "file missing on disk"}), 410 # check watermark applicability try: applicable = WMUtils.is_watermarking_applicable( method=method, pdf=str(file_path), position=position ) if applicable is False: inc_watermark_failed(method, "applicability") app.logger.info( "Watermarking method %s not applicable for document %s", method, doc_id, ) return jsonify({"error": "watermarking method not applicable"}), 400 except Exception as e: inc_watermark_failed(method, "applicability_exception") app.logger.error( "Watermark applicability check failed for document %s: %s", doc_id, e ) return jsonify({"error": "watermark applicability check failed"}), 400 # apply watermark  bytes try: _wm_start = time.time() wm_bytes: bytes = WMUtils.apply_watermark( pdf=str(file_path), secret=secret, key=key, method=method, intended_for=intended_for, position=position, ) observe_watermark_duration(method, time.time() - _wm_start) if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: inc_watermark_failed(method, "empty_output") app.logger.error( "Watermarking produced no output for document %s using method %s", doc_id, method, ) return jsonify({"error": "watermarking produced no output"}), 500 except Exception as e: inc_watermark_failed(method, "exception") app.logger.error( "Watermarking failed for document %s using method %s: %s", doc_id, method, e, ) return jsonify({"error": "watermarking failed"}), 500 # build destination file name: "&lt;original_name&gt;__&lt;intended_to&gt;.pdf" base_name = Path(row.name or file_path.name).stem intended_slug = secure_filename(intended_for) &gt; dest_dir = file_path.parent &amp; "watermarks" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for &amp;: 'WindowsPath' and 'str' server.py:1045: TypeError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - TypeError: unsuppor... 1 failed, 13 passed, 22 warnings in 20.22s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_178"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_178_1" aria-expanded="false" aria-controls="job_list___sub_collapse_178_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_178_1"><button class="btn btn-outline-success"><span class="job_id">178 : Job ID 23727bb7ca2e499cb55acdc4330ed162</span></button></div></a><div aria-labelledby="job_list___sub_heading_178_1" data-parent="#job_list___sub_accordion_178" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_178_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1049" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1049, 29), end pos: (1049, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitAnd, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1046,7 +1046,7 @@ dest_dir.mkdir(parents=True, exist_ok=True) candidate = f"{base_name}__{intended_slug}.pdf" - dest_path = dest_dir / candidate + dest_path = dest_dir &amp; candidate # write bytes try:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T025730743552Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T025731716133Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.31s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_179"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_179_1" aria-expanded="false" aria-controls="job_list___sub_collapse_179_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_179_1"><button class="btn btn-outline-danger"><span class="job_id">179 : Job ID 352e2759bed14bb8aadb2871884e69c9</span></button></div></a><div aria-labelledby="job_list___sub_heading_179_1" data-parent="#job_list___sub_accordion_179" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_179_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1211" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1211, 37), end pos: (1211, 38)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitAnd, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1208,7 +1208,7 @@ storage_root = Path(app.config["STORAGE_DIR"]).resolve() file_path = Path(row.path) if not file_path.is_absolute(): - file_path = storage_root / file_path + file_path = storage_root &amp; file_path file_path = file_path.resolve() try: file_path.relative_to(storage_root)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.01s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_180"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_180_1" aria-expanded="false" aria-controls="job_list___sub_collapse_180_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_180_1"><button class="btn btn-outline-success"><span class="job_id">180 : Job ID 4381577cf54d40d180dd13d552d8ab6f</span></button></div></a><div aria-labelledby="job_list___sub_heading_180_1" data-parent="#job_list___sub_accordion_180" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_180_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=341" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (341, 45), end pos: (341, 46)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitXor, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -338,7 +338,7 @@ ) return jsonify({"error": "invalid filename"}), 400 - user_dir = app.config["STORAGE_DIR"] / "files" / g.user["login"] + user_dir = app.config["STORAGE_DIR"] ^ "files" / g.user["login"] user_dir.mkdir(parents=True, exist_ok=True) ts = dt.datetime.now(dt.UTC).strftime("%Y%m%dT%H%M%S%fZ")</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } &gt; resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:147: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 &gt; user_dir = app.config["STORAGE_DIR"] ^ "files" / g.user["login"] ^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for /: 'str' and 'str' server.py:341: TypeError __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } &gt; upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:387: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 &gt; user_dir = app.config["STORAGE_DIR"] ^ "files" / g.user["login"] ^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for /: 'str' and 'str' server.py:341: TypeError _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - TypeError: unsupport... FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - TypeError: unsupporte... FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.55s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_181"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_181_1" aria-expanded="false" aria-controls="job_list___sub_collapse_181_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_181_1"><button class="btn btn-outline-success"><span class="job_id">181 : Job ID 42d681e4b879411e8a3b381d84bf7149</span></button></div></a><div aria-labelledby="job_list___sub_heading_181_1" data-parent="#job_list___sub_accordion_181" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_181_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=341" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (341, 55), end pos: (341, 56)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitXor, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -338,7 +338,7 @@ ) return jsonify({"error": "invalid filename"}), 400 - user_dir = app.config["STORAGE_DIR"] / "files" / g.user["login"] + user_dir = app.config["STORAGE_DIR"] / "files" ^ g.user["login"] user_dir.mkdir(parents=True, exist_ok=True) ts = dt.datetime.now(dt.UTC).strftime("%Y%m%dT%H%M%S%fZ")</pre></div><div class="alert alert-secondary"><pre class="diff">...F.F.F.FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } &gt; resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:147: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 &gt; user_dir = app.config["STORAGE_DIR"] / "files" ^ g.user["login"] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for ^: 'WindowsPath' and 'str' server.py:341: TypeError __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } &gt; upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:387: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 &gt; user_dir = app.config["STORAGE_DIR"] / "files" ^ g.user["login"] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for ^: 'WindowsPath' and 'str' server.py:341: TypeError _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - TypeError: unsupport... FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - TypeError: unsupporte... FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 6 failed, 8 passed, 22 warnings in 20.86s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_182"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_182_1" aria-expanded="false" aria-controls="job_list___sub_collapse_182_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_182_1"><button class="btn btn-outline-success"><span class="job_id">182 : Job ID 626a07f0f6e04a5bb0e700036c61ea35</span></button></div></a><div aria-labelledby="job_list___sub_heading_182_1" data-parent="#job_list___sub_accordion_182" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_182_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=350" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (350, 36), end pos: (350, 37)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitXor, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -347,7 +347,7 @@ try: # Check for path traversal attempts - stored_path = (user_dir / stored_name).resolve() + stored_path = (user_dir ^ stored_name).resolve() if not str(stored_path).startswith(str(user_dir.resolve())): app.logger.warning("Upload attempt with invalid path: %s", stored_path) return jsonify({"error": "invalid path"}), 400</pre></div><div class="alert alert-secondary"><pre class="diff">...F.F.F.FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: unsupported operand type(s) for ^: 'WindowsPath' and 'str' __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: unsupported operand type(s) for ^: 'WindowsPath' and 'str' _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - assert 500 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 6 failed, 8 passed, 22 warnings in 19.21s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_183"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_183_1" aria-expanded="false" aria-controls="job_list___sub_collapse_183_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_183_1"><button class="btn btn-outline-danger"><span class="job_id">183 : Job ID 3220edd498f1493980d491720597fd67</span></button></div></a><div aria-labelledby="job_list___sub_heading_183_1" data-parent="#job_list___sub_accordion_183" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_183_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=785" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (785, 30), end pos: (785, 31)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitXor, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -782,7 +782,7 @@ storage_root = storage_root.resolve() fp = Path(p) if not fp.is_absolute(): - fp = storage_root / fp + fp = storage_root ^ fp fp = fp.resolve() # Python 3.12 has is_relative_to on Path if hasattr(fp, "is_relative_to"):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.15s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_184"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_184_1" aria-expanded="false" aria-controls="job_list___sub_collapse_184_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_184_1"><button class="btn btn-outline-danger"><span class="job_id">184 : Job ID e1960343202c44028537aef12a9597b1</span></button></div></a><div aria-labelledby="job_list___sub_heading_184_1" data-parent="#job_list___sub_accordion_184" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_184_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=981" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (981, 37), end pos: (981, 38)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitXor, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -978,7 +978,7 @@ storage_root = Path(app.config["STORAGE_DIR"]).resolve() file_path = Path(row.path) if not file_path.is_absolute(): - file_path = storage_root / file_path + file_path = storage_root ^ file_path file_path = file_path.resolve() try: file_path.relative_to(storage_root)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.85s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_185"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_185_1" aria-expanded="false" aria-controls="job_list___sub_collapse_185_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_185_1"><button class="btn btn-outline-success"><span class="job_id">185 : Job ID f5cdc42b561848f6a27884b966f89b90</span></button></div></a><div aria-labelledby="job_list___sub_heading_185_1" data-parent="#job_list___sub_accordion_185" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_185_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1045" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1045, 36), end pos: (1045, 37)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitXor, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1042,7 +1042,7 @@ # build destination file name: "&lt;original_name&gt;__&lt;intended_to&gt;.pdf" base_name = Path(row.name or file_path.name).stem intended_slug = secure_filename(intended_for) - dest_dir = file_path.parent / "watermarks" + dest_dir = file_path.parent ^ "watermarks" dest_dir.mkdir(parents=True, exist_ok=True) candidate = f"{base_name}__{intended_slug}.pdf"</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} &gt; resp = client.post("/api/create-watermark", json=parameters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:317: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ document_id = 1 @app.post("/api/create-watermark") @app.post("/api/create-watermark/&lt;int:document_id&gt;") @require_auth def create_watermark(document_id: int | None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on GET if not document_id: document_id = ( request.args.get("id") or request.args.get("documentid") or (request.is_json and (request.get_json(silent=True) or {}).get("id")) ) try: doc_id = document_id except (TypeError, ValueError): app.logger.warning("Invalid document id in query: %s", document_id) return jsonify({"error": "document id required"}), 400 payload = request.get_json(silent=True) or {} # allow a couple of aliases for convenience method = payload.get("method") intended_for = payload.get("intended_for") position = payload.get("position") or None secret = payload.get("secret") key = payload.get("key") # validate input try: if doc_id is None: app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id) return jsonify({"error": "document_id (int) is required"}), 400 if ( not method or not intended_for or not isinstance(secret, str) or not isinstance(key, str) ): app.logger.warning("Missing required fields for watermarking: %s", payload) return jsonify( {"error": "method, intended_for, secret, and key are required"} ), 400 # lookup the document; enforce ownership try: with get_engine().connect() as conn: row = conn.execute( text( """ SELECT id, name, path FROM Documents WHERE id = :id AND ownerid = :owner LIMIT 1 """ ), {"id": doc_id, "owner": int(g.user["id"])}, ).first() except Exception as e: app.logger.error("Database error fetching document %s", e) return jsonify({"error": "database error"}), 503 if not row: app.logger.warning( "Document not found or access denied for watermarking id=%s", doc_id ) return jsonify({"error": "document not found"}), 404 # resolve path safely under STORAGE_DIR storage_root = Path(app.config["STORAGE_DIR"]).resolve() file_path = Path(row.path) if not file_path.is_absolute(): file_path = storage_root / file_path file_path = file_path.resolve() try: file_path.relative_to(storage_root) except ValueError: app.logger.warning("Rejected document path for id %s: %s", doc_id, row.path) return jsonify({"error": "document path invalid"}), 500 if not file_path.exists(): app.logger.error("File missing on disk for document id=%s", doc_id) return jsonify({"error": "file missing on disk"}), 410 # check watermark applicability try: applicable = WMUtils.is_watermarking_applicable( method=method, pdf=str(file_path), position=position ) if applicable is False: inc_watermark_failed(method, "applicability") app.logger.info( "Watermarking method %s not applicable for document %s", method, doc_id, ) return jsonify({"error": "watermarking method not applicable"}), 400 except Exception as e: inc_watermark_failed(method, "applicability_exception") app.logger.error( "Watermark applicability check failed for document %s: %s", doc_id, e ) return jsonify({"error": "watermark applicability check failed"}), 400 # apply watermark  bytes try: _wm_start = time.time() wm_bytes: bytes = WMUtils.apply_watermark( pdf=str(file_path), secret=secret, key=key, method=method, intended_for=intended_for, position=position, ) observe_watermark_duration(method, time.time() - _wm_start) if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: inc_watermark_failed(method, "empty_output") app.logger.error( "Watermarking produced no output for document %s using method %s", doc_id, method, ) return jsonify({"error": "watermarking produced no output"}), 500 except Exception as e: inc_watermark_failed(method, "exception") app.logger.error( "Watermarking failed for document %s using method %s: %s", doc_id, method, e, ) return jsonify({"error": "watermarking failed"}), 500 # build destination file name: "&lt;original_name&gt;__&lt;intended_to&gt;.pdf" base_name = Path(row.name or file_path.name).stem intended_slug = secure_filename(intended_for) &gt; dest_dir = file_path.parent ^ "watermarks" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for ^: 'WindowsPath' and 'str' server.py:1045: TypeError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - TypeError: unsuppor... 1 failed, 13 passed, 22 warnings in 20.22s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_186"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_186_1" aria-expanded="false" aria-controls="job_list___sub_collapse_186_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_186_1"><button class="btn btn-outline-success"><span class="job_id">186 : Job ID 20dce48552d14c8cb9748f8044a2f7e9</span></button></div></a><div aria-labelledby="job_list___sub_heading_186_1" data-parent="#job_list___sub_accordion_186" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_186_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1049" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1049, 29), end pos: (1049, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitXor, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1046,7 +1046,7 @@ dest_dir.mkdir(parents=True, exist_ok=True) candidate = f"{base_name}__{intended_slug}.pdf" - dest_path = dest_dir / candidate + dest_path = dest_dir ^ candidate # write bytes try:</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} &gt; resp = client.post("/api/create-watermark", json=parameters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:317: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ document_id = 1 @app.post("/api/create-watermark") @app.post("/api/create-watermark/&lt;int:document_id&gt;") @require_auth def create_watermark(document_id: int | None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on GET if not document_id: document_id = ( request.args.get("id") or request.args.get("documentid") or (request.is_json and (request.get_json(silent=True) or {}).get("id")) ) try: doc_id = document_id except (TypeError, ValueError): app.logger.warning("Invalid document id in query: %s", document_id) return jsonify({"error": "document id required"}), 400 payload = request.get_json(silent=True) or {} # allow a couple of aliases for convenience method = payload.get("method") intended_for = payload.get("intended_for") position = payload.get("position") or None secret = payload.get("secret") key = payload.get("key") # validate input try: if doc_id is None: app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id) return jsonify({"error": "document_id (int) is required"}), 400 if ( not method or not intended_for or not isinstance(secret, str) or not isinstance(key, str) ): app.logger.warning("Missing required fields for watermarking: %s", payload) return jsonify( {"error": "method, intended_for, secret, and key are required"} ), 400 # lookup the document; enforce ownership try: with get_engine().connect() as conn: row = conn.execute( text( """ SELECT id, name, path FROM Documents WHERE id = :id AND ownerid = :owner LIMIT 1 """ ), {"id": doc_id, "owner": int(g.user["id"])}, ).first() except Exception as e: app.logger.error("Database error fetching document %s", e) return jsonify({"error": "database error"}), 503 if not row: app.logger.warning( "Document not found or access denied for watermarking id=%s", doc_id ) return jsonify({"error": "document not found"}), 404 # resolve path safely under STORAGE_DIR storage_root = Path(app.config["STORAGE_DIR"]).resolve() file_path = Path(row.path) if not file_path.is_absolute(): file_path = storage_root / file_path file_path = file_path.resolve() try: file_path.relative_to(storage_root) except ValueError: app.logger.warning("Rejected document path for id %s: %s", doc_id, row.path) return jsonify({"error": "document path invalid"}), 500 if not file_path.exists(): app.logger.error("File missing on disk for document id=%s", doc_id) return jsonify({"error": "file missing on disk"}), 410 # check watermark applicability try: applicable = WMUtils.is_watermarking_applicable( method=method, pdf=str(file_path), position=position ) if applicable is False: inc_watermark_failed(method, "applicability") app.logger.info( "Watermarking method %s not applicable for document %s", method, doc_id, ) return jsonify({"error": "watermarking method not applicable"}), 400 except Exception as e: inc_watermark_failed(method, "applicability_exception") app.logger.error( "Watermark applicability check failed for document %s: %s", doc_id, e ) return jsonify({"error": "watermark applicability check failed"}), 400 # apply watermark  bytes try: _wm_start = time.time() wm_bytes: bytes = WMUtils.apply_watermark( pdf=str(file_path), secret=secret, key=key, method=method, intended_for=intended_for, position=position, ) observe_watermark_duration(method, time.time() - _wm_start) if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: inc_watermark_failed(method, "empty_output") app.logger.error( "Watermarking produced no output for document %s using method %s", doc_id, method, ) return jsonify({"error": "watermarking produced no output"}), 500 except Exception as e: inc_watermark_failed(method, "exception") app.logger.error( "Watermarking failed for document %s using method %s: %s", doc_id, method, e, ) return jsonify({"error": "watermarking failed"}), 500 # build destination file name: "&lt;original_name&gt;__&lt;intended_to&gt;.pdf" base_name = Path(row.name or file_path.name).stem intended_slug = secure_filename(intended_for) dest_dir = file_path.parent / "watermarks" dest_dir.mkdir(parents=True, exist_ok=True) candidate = f"{base_name}__{intended_slug}.pdf" &gt; dest_path = dest_dir ^ candidate ^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for ^: 'WindowsPath' and 'str' server.py:1049: TypeError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - TypeError: unsuppor... 1 failed, 13 passed, 22 warnings in 20.35s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_187"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_187_1" aria-expanded="false" aria-controls="job_list___sub_collapse_187_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_187_1"><button class="btn btn-outline-danger"><span class="job_id">187 : Job ID 957c390bc4c04b2ea7ee7d2b2c0aedac</span></button></div></a><div aria-labelledby="job_list___sub_heading_187_1" data-parent="#job_list___sub_accordion_187" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_187_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1211" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1211, 37), end pos: (1211, 38)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitXor, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1208,7 +1208,7 @@ storage_root = Path(app.config["STORAGE_DIR"]).resolve() file_path = Path(row.path) if not file_path.is_absolute(): - file_path = storage_root / file_path + file_path = storage_root ^ file_path file_path = file_path.resolve() try: file_path.relative_to(storage_root)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.19s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_188"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_188_1" aria-expanded="false" aria-controls="job_list___sub_collapse_188_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_188_1"><button class="btn btn-outline-success"><span class="job_id">188 : Job ID b7f157ea9f9247e0b22887d90c0a61b0</span></button></div></a><div aria-labelledby="job_list___sub_heading_188_1" data-parent="#job_list___sub_accordion_188" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_188_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=34" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (34, 15), end pos: (34, 17)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Pow_Add, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -31,7 +31,7 @@ render_prometheus, ) -MAX_DB_INT = (2**63) - 1 +MAX_DB_INT = (2+63) - 1 RMAPHandler = None # default if not os.environ.get("TATOU_TEST_DISABLE_RMAP"):</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T062002542944Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T062003422700Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 20.07s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_189"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_189_1" aria-expanded="false" aria-controls="job_list___sub_collapse_189_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_189_1"><button class="btn btn-outline-success"><span class="job_id">189 : Job ID 6dcec2058ec44ce0aeae2f01b9540334</span></button></div></a><div aria-labelledby="job_list___sub_heading_189_1" data-parent="#job_list___sub_accordion_189" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_189_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=34" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (34, 15), end pos: (34, 17)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Pow_Sub, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -31,7 +31,7 @@ render_prometheus, ) -MAX_DB_INT = (2**63) - 1 +MAX_DB_INT = (2-63) - 1 RMAPHandler = None # default if not os.environ.get("TATOU_TEST_DISABLE_RMAP"):</pre></div><div class="alert alert-secondary"><pre class="diff">.....F.F.FFF.. [100%] ================================== FAILURES =================================== __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse 33 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:463 Invalid document id in query ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 42 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 42 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:400: AssertionError _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse streamed [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:824 Non-positive document id for deletion: 2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_list_versions_route - assert 400 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 400 == 200 5 failed, 9 passed, 22 warnings in 20.03s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_190"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_190_1" aria-expanded="false" aria-controls="job_list___sub_collapse_190_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_190_1"><button class="btn btn-outline-danger"><span class="job_id">190 : Job ID 668afd5cf2ab4111a0a3ffe8c9ba6175</span></button></div></a><div aria-labelledby="job_list___sub_heading_190_1" data-parent="#job_list___sub_accordion_190" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_190_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=34" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (34, 15), end pos: (34, 17)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Pow_Mul, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -31,7 +31,7 @@ render_prometheus, ) -MAX_DB_INT = (2**63) - 1 +MAX_DB_INT = (2*63) - 1 RMAPHandler = None # default if not os.environ.get("TATOU_TEST_DISABLE_RMAP"):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.76s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_191"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_191_1" aria-expanded="false" aria-controls="job_list___sub_collapse_191_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_191_1"><button class="btn btn-outline-success"><span class="job_id">191 : Job ID 40dd08ad28d645719d0ba43880f486de</span></button></div></a><div aria-labelledby="job_list___sub_heading_191_1" data-parent="#job_list___sub_accordion_191" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_191_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=34" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (34, 15), end pos: (34, 17)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Pow_Div, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -31,7 +31,7 @@ render_prometheus, ) -MAX_DB_INT = (2**63) - 1 +MAX_DB_INT = (2/63) - 1 RMAPHandler = None # default if not os.environ.get("TATOU_TEST_DISABLE_RMAP"):</pre></div><div class="alert alert-secondary"><pre class="diff">.....F.F.FFF.. [100%] ================================== FAILURES =================================== __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse 33 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:463 Invalid document id in query ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 42 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 42 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:400: AssertionError _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse streamed [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:824 Non-positive document id for deletion: 2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_list_versions_route - assert 400 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 400 == 200 5 failed, 9 passed, 22 warnings in 19.56s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_192"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_192_1" aria-expanded="false" aria-controls="job_list___sub_collapse_192_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_192_1"><button class="btn btn-outline-success"><span class="job_id">192 : Job ID 1b283b6a8e564d75aa0392fe03adc88f</span></button></div></a><div aria-labelledby="job_list___sub_heading_192_1" data-parent="#job_list___sub_accordion_192" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_192_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=34" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (34, 15), end pos: (34, 17)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Pow_FloorDiv, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -31,7 +31,7 @@ render_prometheus, ) -MAX_DB_INT = (2**63) - 1 +MAX_DB_INT = (2//63) - 1 RMAPHandler = None # default if not os.environ.get("TATOU_TEST_DISABLE_RMAP"):</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T222931859705Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse 33 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:463 Invalid document id in query ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 42 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T222932657315Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse streamed [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:824 Non-positive document id for deletion: 2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 400 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 400 == 200 10 failed, 4 passed, 22 warnings in 19.68s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_193"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_193_1" aria-expanded="false" aria-controls="job_list___sub_collapse_193_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_193_1"><button class="btn btn-outline-success"><span class="job_id">193 : Job ID 454507be8d21488fa0c12926694192c2</span></button></div></a><div aria-labelledby="job_list___sub_heading_193_1" data-parent="#job_list___sub_accordion_193" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_193_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=34" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (34, 15), end pos: (34, 17)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Pow_Mod, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -31,7 +31,7 @@ render_prometheus, ) -MAX_DB_INT = (2**63) - 1 +MAX_DB_INT = (2%63) - 1 RMAPHandler = None # default if not os.environ.get("TATOU_TEST_DISABLE_RMAP"):</pre></div><div class="alert alert-secondary"><pre class="diff">.....F.F.FFF.. [100%] ================================== FAILURES =================================== __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests assert resp.status_code == 200 assert resp.is_json #check types #extract data doc_list = resp_data.get("versions") assert isinstance(doc_list, list) #cycle through each element in the list for elem in doc_list: assert isinstance(elem.get("id"), str) assert isinstance(elem.get("documentid"), str) #check the version is from the correct document assert elem.get("documentid") == str(parameters["documentid"]) assert isinstance(elem.get("link"), str) assert isinstance(elem.get("intended_for"), str) assert isinstance(elem.get("secret"), str) assert isinstance(elem.get("method"), str) #Test with no parameters resp = client.get("/api/list-versions") assert resp.status_code == 400 #Test with json parameters resp = client.get("/api/list-versions", json = parameters) assert resp.status_code == 400 #Test with wrong parameters (missing file) resp = client.get("/api/list-versions", query_string = {'documentid': 4}) &gt; assert resp.status_code == 404 E assert 400 == 404 E + where 400 = &lt;WrapperTestResponse streamed [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:245: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:463 Invalid document id in query WARNING server:server.py:463 Invalid document id in query WARNING server:server.py:463 Invalid document id in query ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle assert is_pdf assert is_inline #Test with no parameters resp = client.get("/api/get-document") assert resp.status_code == 400 #Test with json parameters resp = client.get("/api/get-document", json = parameters) assert resp.status_code == 400 #Test with wrong parameters (missing file) resp = client.get("/api/get-document", query_string = {'documentid': 4}) &gt; assert resp.status_code == 404 E assert 400 == 404 E + where 400 = &lt;WrapperTestResponse streamed [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:293: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:580 Invalid document id in query WARNING server:server.py:580 Invalid document id in query _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("id"), int) assert isinstance(data.get("documentid"), int) assert isinstance(data.get("link"), str) assert isinstance(data.get("intended_for"), str) assert isinstance(data.get("method"), str) assert isinstance(data.get("position"), str) assert isinstance(data.get("filename"), str) assert isinstance(data.get("size"), int) #check values assert data.get("documentid") == parameters["id"] assert data.get("intended_for") == parameters["intended_for"] assert data.get("method") == parameters["method"] assert data.get("position") == parameters["position"] #Tests with wrong parameters #Test with exact same call: should return database insertion error (Non unique entry) resp = client.post("/api/create-watermark", json=parameters) assert resp.status_code == 503 #Non existant method resp = client.post("/api/create-watermark", json={"method": "watermarkmethod", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Non existant document resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 8}) &gt; assert resp.status_code == 404 E assert 400 == 404 E + where 400 = &lt;WrapperTestResponse streamed [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:350: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1097 Integrity error during version insert for document 1: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b' for key 'uq_Versions_link'") [SQL: INSERT INTO Versions (documentid, link, intended_for, secret, method, position, path) VALUES (%(documentid)s, %(link)s, %(intended_for)s, %(secret)s, %(method)s, %(position)s, %(path)s) ] [parameters: {'documentid': 1, 'link': 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b', 'intended_for': 'Mickey Mouse', 'secret': 'secret', 'method': 'robust-xmp', 'position': 'metadata-only', 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username\\watermarks\\My File__Mickey_Mouse.pdf'}] (Background on this error at: https://sqlalche.me/e/20/gkpj) ERROR server:server.py:1007 Watermark applicability check failed for document 1: "Unknown watermarking method: 'watermarkmethod'. Known: ['overlay-watermark', 'robust-xmp', 'signed-annots']" __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 42 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:400: AssertionError _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse streamed [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:824 Non-positive document id for deletion: 2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_list_versions_route - assert 400 == 404 FAILED ..\test\test_api.py::test_get_document_route - assert 400 == 404 FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 404 FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 400 == 200 5 failed, 9 passed, 22 warnings in 19.82s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_194"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_194_1" aria-expanded="false" aria-controls="job_list___sub_collapse_194_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_194_1"><button class="btn btn-outline-success"><span class="job_id">194 : Job ID 8c6ed73c32384dcd88c380bd0cea7641</span></button></div></a><div aria-labelledby="job_list___sub_heading_194_1" data-parent="#job_list___sub_accordion_194" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_194_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=34" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (34, 15), end pos: (34, 17)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Pow_RShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -31,7 +31,7 @@ render_prometheus, ) -MAX_DB_INT = (2**63) - 1 +MAX_DB_INT = (2&gt;&gt;63) - 1 RMAPHandler = None # default if not os.environ.get("TATOU_TEST_DISABLE_RMAP"):</pre></div><div class="alert alert-secondary"><pre class="diff">...F.F.F.FFF.F [100%]</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_195"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_195_1" aria-expanded="false" aria-controls="job_list___sub_collapse_195_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_195_1"><button class="btn btn-outline-danger"><span class="job_id">195 : Job ID 6ed8fed896404cceb73bf5a268495c1c</span></button></div></a><div aria-labelledby="job_list___sub_heading_195_1" data-parent="#job_list___sub_accordion_195" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_195_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=34" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (34, 15), end pos: (34, 17)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Pow_LShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -31,7 +31,7 @@ render_prometheus, ) -MAX_DB_INT = (2**63) - 1 +MAX_DB_INT = (2&lt;&lt;63) - 1 RMAPHandler = None # default if not os.environ.get("TATOU_TEST_DISABLE_RMAP"):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.67s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_196"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_196_1" aria-expanded="false" aria-controls="job_list___sub_collapse_196_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_196_1"><button class="btn btn-outline-success"><span class="job_id">196 : Job ID a2abe9e7b0e14e99bd1bca3756b7821d</span></button></div></a><div aria-labelledby="job_list___sub_heading_196_1" data-parent="#job_list___sub_accordion_196" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_196_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=34" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (34, 15), end pos: (34, 17)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Pow_BitOr, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -31,7 +31,7 @@ render_prometheus, ) -MAX_DB_INT = (2**63) - 1 +MAX_DB_INT = (2|63) - 1 RMAPHandler = None # default if not os.environ.get("TATOU_TEST_DISABLE_RMAP"):</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T233053018443Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T233054023778Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.64s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_197"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_197_1" aria-expanded="false" aria-controls="job_list___sub_collapse_197_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_197_1"><button class="btn btn-outline-success"><span class="job_id">197 : Job ID 7018d4e6bbb04e02b718cda3bae8d136</span></button></div></a><div aria-labelledby="job_list___sub_heading_197_1" data-parent="#job_list___sub_accordion_197" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_197_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=34" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (34, 15), end pos: (34, 17)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Pow_BitAnd, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -31,7 +31,7 @@ render_prometheus, ) -MAX_DB_INT = (2**63) - 1 +MAX_DB_INT = (2&amp;63) - 1 RMAPHandler = None # default if not os.environ.get("TATOU_TEST_DISABLE_RMAP"):</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T231303328255Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T231304230668Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse streamed [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:824 Non-positive document id for deletion: 2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 400 == 200 8 failed, 6 passed, 22 warnings in 19.24s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_198"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_198_1" aria-expanded="false" aria-controls="job_list___sub_collapse_198_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_198_1"><button class="btn btn-outline-danger"><span class="job_id">198 : Job ID 4f5f3cecddb44deea9eee47a9c8dc905</span></button></div></a><div aria-labelledby="job_list___sub_heading_198_1" data-parent="#job_list___sub_accordion_198" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_198_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=34" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (34, 15), end pos: (34, 17)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Pow_BitXor, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -31,7 +31,7 @@ render_prometheus, ) -MAX_DB_INT = (2**63) - 1 +MAX_DB_INT = (2^63) - 1 RMAPHandler = None # default if not os.environ.get("TATOU_TEST_DISABLE_RMAP"):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.80s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_199"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_199_1" aria-expanded="false" aria-controls="job_list___sub_collapse_199_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_199_1"><button class="btn btn-outline-success"><span class="job_id">199 : Job ID 8ce1375c817e48b3992f89b422f5f6db</span></button></div></a><div aria-labelledby="job_list___sub_heading_199_1" data-parent="#job_list___sub_accordion_199" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_199_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=456" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (456, 39), end pos: (456, 40)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -453,7 +453,7 @@ @app.get("/api/list-versions") @app.get("/api/list-versions/&lt;int:document_id&gt;") @require_auth - def list_versions(document_id: int | None = None): + def list_versions(document_id: int + None = None): # Input validation if document_id is None: document_id = request.args.get("id") or request.args.get("documentid")</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:456: in create_app def list_versions(document_id: int + None = None): ^^^^^^^^^^ E TypeError: unsupported operand type(s) for +: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T19:47:36+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T19:47:36+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_user-files Removing Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_user-files Resource is still in use Volume softsec-tatou_db-data Removed Network softsec-tatou_default Removed time="2025-10-16T19:47:37+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T19:47:37+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for +: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.04s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_200"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_200_1" aria-expanded="false" aria-controls="job_list___sub_collapse_200_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_200_1"><button class="btn btn-outline-success"><span class="job_id">200 : Job ID 893b4adde9fc405485b9d2efd7cde167</span></button></div></a><div aria-labelledby="job_list___sub_heading_200_1" data-parent="#job_list___sub_accordion_200" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_200_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=573" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (573, 38), end pos: (573, 39)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -570,7 +570,7 @@ @app.get("/api/get-document") @app.get("/api/get-document/&lt;int:document_id&gt;") @require_auth - def get_document(document_id: int | None = None): + def get_document(document_id: int + None = None): # Support both path param and ?id=/ ?documentid= if document_id is None: document_id = request.args.get("id") or request.args.get("documentid")</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:573: in create_app def get_document(document_id: int + None = None): ^^^^^^^^^^ E TypeError: unsupported operand type(s) for +: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T19:32:36+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T19:32:36+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_db-data Removing Volume softsec-tatou_user-files Removing Volume softsec-tatou_grafana-data Removing Network softsec-tatou_default Removing Volume softsec-tatou_db-data Removed Volume softsec-tatou_user-files Resource is still in use Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removed time="2025-10-16T19:32:37+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T19:32:37+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for +: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.12s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_201"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_201_1" aria-expanded="false" aria-controls="job_list___sub_collapse_201_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_201_1"><button class="btn btn-outline-success"><span class="job_id">201 : Job ID e5770adf8e8a441ab087899c4c9f0489</span></button></div></a><div aria-labelledby="job_list___sub_heading_201_1" data-parent="#job_list___sub_accordion_201" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_201_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=804" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (804, 41), end pos: (804, 42)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -801,7 +801,7 @@ @app.route("/api/delete-document", methods=["DELETE", "POST"]) @app.route("/api/delete-document/&lt;document_id&gt;", methods=["DELETE"]) @require_auth - def delete_document(document_id: int | None = None): + def delete_document(document_id: int + None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on POST if document_id in (None, ""): document_id = (</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:804: in create_app def delete_document(document_id: int + None = None): ^^^^^^^^^^ E TypeError: unsupported operand type(s) for +: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T16:46:59+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T16:46:59+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_db-data Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_user-files Removing Network softsec-tatou_default Removing Volume softsec-tatou_db-data Removed Volume softsec-tatou_user-files Resource is still in use Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removed time="2025-10-16T16:47:00+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T16:47:00+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for +: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.20s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_202"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_202_1" aria-expanded="false" aria-controls="job_list___sub_collapse_202_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_202_1"><button class="btn btn-outline-success"><span class="job_id">202 : Job ID 074fbdabe73b451f8b25ce050a007051</span></button></div></a><div aria-labelledby="job_list___sub_heading_202_1" data-parent="#job_list___sub_accordion_202" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_202_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=909" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (909, 42), end pos: (909, 43)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -906,7 +906,7 @@ @app.post("/api/create-watermark") @app.post("/api/create-watermark/&lt;int:document_id&gt;") @require_auth - def create_watermark(document_id: int | None = None): + def create_watermark(document_id: int + None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on GET if not document_id: document_id = (</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:909: in create_app def create_watermark(document_id: int + None = None): ^^^^^^^^^^ E TypeError: unsupported operand type(s) for +: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T18:00:49+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T18:00:49+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_user-files Removing Volume softsec-tatou_grafana-data Resource is still in use Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_db-data Removed Network softsec-tatou_default Removed time="2025-10-16T18:00:50+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T18:00:50+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for +: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.14s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_203"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_203_1" aria-expanded="false" aria-controls="job_list___sub_collapse_203_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_203_1"><button class="btn btn-outline-success"><span class="job_id">203 : Job ID 1e45f0125afd4d99b1e98afb3df64b2f</span></button></div></a><div aria-labelledby="job_list___sub_heading_203_1" data-parent="#job_list___sub_accordion_203" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_203_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1024" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1024, 47), end pos: (1024, 48)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1021,7 +1021,7 @@ position=position, ) observe_watermark_duration(method, time.time() - _wm_start) - if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: + if not isinstance(wm_bytes, (bytes + bytearray)) or len(wm_bytes) == 0: inc_watermark_failed(method, "empty_output") app.logger.error( "Watermarking produced no output for document %s using method %s",</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1034 Watermarking failed for document 1 using method robust-xmp: unsupported operand type(s) for +: 'type' and 'type' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 1 failed, 13 passed, 22 warnings in 20.72s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_204"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_204_1" aria-expanded="false" aria-controls="job_list___sub_collapse_204_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_204_1"><button class="btn btn-outline-success"><span class="job_id">204 : Job ID 62e8639b5e404908a44ef44340ab44fa</span></button></div></a><div aria-labelledby="job_list___sub_heading_204_1" data-parent="#job_list___sub_accordion_204" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_204_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1146" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1146, 40), end pos: (1146, 41)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1143,7 +1143,7 @@ @app.post("/api/read-watermark") @app.post("/api/read-watermark/&lt;int:document_id&gt;") @require_auth - def read_watermark(document_id: int | None = None): + def read_watermark(document_id: int + None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on POST if not document_id: document_id = (</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:1146: in create_app def read_watermark(document_id: int + None = None): ^^^^^^^^^^ E TypeError: unsupported operand type(s) for +: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-17T08:01:30+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T08:01:30+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_user-files Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_grafana-data Resource is still in use Volume softsec-tatou_db-data Removed Network softsec-tatou_default Removed time="2025-10-17T08:01:31+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T08:01:31+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for +: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.29s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_205"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_205_1" aria-expanded="false" aria-controls="job_list___sub_collapse_205_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_205_1"><button class="btn btn-outline-success"><span class="job_id">205 : Job ID 97ad98b68c234823b22af67c88084905</span></button></div></a><div aria-labelledby="job_list___sub_heading_205_1" data-parent="#job_list___sub_accordion_205" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_205_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=456" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (456, 39), end pos: (456, 40)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -453,7 +453,7 @@ @app.get("/api/list-versions") @app.get("/api/list-versions/&lt;int:document_id&gt;") @require_auth - def list_versions(document_id: int | None = None): + def list_versions(document_id: int - None = None): # Input validation if document_id is None: document_id = request.args.get("id") or request.args.get("documentid")</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:456: in create_app def list_versions(document_id: int - None = None): ^^^^^^^^^^ E TypeError: unsupported operand type(s) for -: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T22:38:50+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T22:38:50+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_user-files Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_user-files Resource is still in use Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_db-data Removed Network softsec-tatou_default Removed time="2025-10-16T22:38:51+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T22:38:51+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for -: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.39s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_206"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_206_1" aria-expanded="false" aria-controls="job_list___sub_collapse_206_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_206_1"><button class="btn btn-outline-success"><span class="job_id">206 : Job ID 9f026c85e79947f5978bf8635502f45f</span></button></div></a><div aria-labelledby="job_list___sub_heading_206_1" data-parent="#job_list___sub_accordion_206" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_206_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=573" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (573, 38), end pos: (573, 39)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -570,7 +570,7 @@ @app.get("/api/get-document") @app.get("/api/get-document/&lt;int:document_id&gt;") @require_auth - def get_document(document_id: int | None = None): + def get_document(document_id: int - None = None): # Support both path param and ?id=/ ?documentid= if document_id is None: document_id = request.args.get("id") or request.args.get("documentid")</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:573: in create_app def get_document(document_id: int - None = None): ^^^^^^^^^^ E TypeError: unsupported operand type(s) for -: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-17T03:38:29+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T03:38:29+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_user-files Removing Volume softsec-tatou_db-data Removed Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removed time="2025-10-17T03:38:30+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T03:38:30+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for -: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.05s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_207"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_207_1" aria-expanded="false" aria-controls="job_list___sub_collapse_207_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_207_1"><button class="btn btn-outline-success"><span class="job_id">207 : Job ID 1636ec4cb0c5485784e1fa78ccd820d1</span></button></div></a><div aria-labelledby="job_list___sub_heading_207_1" data-parent="#job_list___sub_accordion_207" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_207_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=804" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (804, 41), end pos: (804, 42)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -801,7 +801,7 @@ @app.route("/api/delete-document", methods=["DELETE", "POST"]) @app.route("/api/delete-document/&lt;document_id&gt;", methods=["DELETE"]) @require_auth - def delete_document(document_id: int | None = None): + def delete_document(document_id: int - None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on POST if document_id in (None, ""): document_id = (</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:804: in create_app def delete_document(document_id: int - None = None): ^^^^^^^^^^ E TypeError: unsupported operand type(s) for -: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T20:29:41+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T20:29:41+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_user-files Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_db-data Removed Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removed time="2025-10-16T20:29:42+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T20:29:42+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for -: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.79s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_208"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_208_1" aria-expanded="false" aria-controls="job_list___sub_collapse_208_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_208_1"><button class="btn btn-outline-success"><span class="job_id">208 : Job ID 10cff76a22e248bd80a27dc4baeac32f</span></button></div></a><div aria-labelledby="job_list___sub_heading_208_1" data-parent="#job_list___sub_accordion_208" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_208_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=909" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (909, 42), end pos: (909, 43)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -906,7 +906,7 @@ @app.post("/api/create-watermark") @app.post("/api/create-watermark/&lt;int:document_id&gt;") @require_auth - def create_watermark(document_id: int | None = None): + def create_watermark(document_id: int - None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on GET if not document_id: document_id = (</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:909: in create_app def create_watermark(document_id: int - None = None): ^^^^^^^^^^ E TypeError: unsupported operand type(s) for -: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-17T01:42:44+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T01:42:44+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_db-data Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_user-files Removing Network softsec-tatou_default Removing Volume softsec-tatou_db-data Removed Volume softsec-tatou_user-files Resource is still in use Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removed time="2025-10-17T01:42:45+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T01:42:45+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for -: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.09s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_209"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_209_1" aria-expanded="false" aria-controls="job_list___sub_collapse_209_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_209_1"><button class="btn btn-outline-success"><span class="job_id">209 : Job ID 2a35c5df71a64da4b400604b8999cc8b</span></button></div></a><div aria-labelledby="job_list___sub_heading_209_1" data-parent="#job_list___sub_accordion_209" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_209_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1024" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1024, 47), end pos: (1024, 48)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1021,7 +1021,7 @@ position=position, ) observe_watermark_duration(method, time.time() - _wm_start) - if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: + if not isinstance(wm_bytes, (bytes - bytearray)) or len(wm_bytes) == 0: inc_watermark_failed(method, "empty_output") app.logger.error( "Watermarking produced no output for document %s using method %s",</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1034 Watermarking failed for document 1 using method robust-xmp: unsupported operand type(s) for -: 'type' and 'type' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 1 failed, 13 passed, 22 warnings in 20.40s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_210"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_210_1" aria-expanded="false" aria-controls="job_list___sub_collapse_210_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_210_1"><button class="btn btn-outline-success"><span class="job_id">210 : Job ID 749c4f446b2644c6a156f9f0433bce1c</span></button></div></a><div aria-labelledby="job_list___sub_heading_210_1" data-parent="#job_list___sub_accordion_210" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_210_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1146" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1146, 40), end pos: (1146, 41)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1143,7 +1143,7 @@ @app.post("/api/read-watermark") @app.post("/api/read-watermark/&lt;int:document_id&gt;") @require_auth - def read_watermark(document_id: int | None = None): + def read_watermark(document_id: int - None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on POST if not document_id: document_id = (</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:1146: in create_app def read_watermark(document_id: int - None = None): ^^^^^^^^^^ E TypeError: unsupported operand type(s) for -: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-17T06:21:45+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T06:21:45+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_user-files Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_grafana-data Resource is still in use Volume softsec-tatou_db-data Removed Network softsec-tatou_default Removed time="2025-10-17T06:21:46+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T06:21:46+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for -: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.52s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_211"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_211_1" aria-expanded="false" aria-controls="job_list___sub_collapse_211_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_211_1"><button class="btn btn-outline-success"><span class="job_id">211 : Job ID bd06d11967a04e5daa1cca375dc13a1f</span></button></div></a><div aria-labelledby="job_list___sub_heading_211_1" data-parent="#job_list___sub_accordion_211" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_211_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=456" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (456, 39), end pos: (456, 40)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -453,7 +453,7 @@ @app.get("/api/list-versions") @app.get("/api/list-versions/&lt;int:document_id&gt;") @require_auth - def list_versions(document_id: int | None = None): + def list_versions(document_id: int * None = None): # Input validation if document_id is None: document_id = request.args.get("id") or request.args.get("documentid")</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:456: in create_app def list_versions(document_id: int * None = None): ^^^^^^^^^^ E TypeError: unsupported operand type(s) for *: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-17T03:05:16+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T03:05:16+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_user-files Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_grafana-data Resource is still in use Volume softsec-tatou_db-data Removed Network softsec-tatou_default Removed time="2025-10-17T03:05:18+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T03:05:19+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for *: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 14.95s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_212"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_212_1" aria-expanded="false" aria-controls="job_list___sub_collapse_212_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_212_1"><button class="btn btn-outline-success"><span class="job_id">212 : Job ID 04ef103c1c2b4e3bb7b1e92ff368a02c</span></button></div></a><div aria-labelledby="job_list___sub_heading_212_1" data-parent="#job_list___sub_accordion_212" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_212_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=573" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (573, 38), end pos: (573, 39)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -570,7 +570,7 @@ @app.get("/api/get-document") @app.get("/api/get-document/&lt;int:document_id&gt;") @require_auth - def get_document(document_id: int | None = None): + def get_document(document_id: int * None = None): # Support both path param and ?id=/ ?documentid= if document_id is None: document_id = request.args.get("id") or request.args.get("documentid")</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:573: in create_app def get_document(document_id: int * None = None): ^^^^^^^^^^ E TypeError: unsupported operand type(s) for *: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T22:47:22+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T22:47:22+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_user-files Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_db-data Removed Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removed time="2025-10-16T22:47:23+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T22:47:23+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for *: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.35s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_213"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_213_1" aria-expanded="false" aria-controls="job_list___sub_collapse_213_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_213_1"><button class="btn btn-outline-success"><span class="job_id">213 : Job ID c6d8003d286543159d878ca2ba3d89ee</span></button></div></a><div aria-labelledby="job_list___sub_heading_213_1" data-parent="#job_list___sub_accordion_213" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_213_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=804" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (804, 41), end pos: (804, 42)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -801,7 +801,7 @@ @app.route("/api/delete-document", methods=["DELETE", "POST"]) @app.route("/api/delete-document/&lt;document_id&gt;", methods=["DELETE"]) @require_auth - def delete_document(document_id: int | None = None): + def delete_document(document_id: int * None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on POST if document_id in (None, ""): document_id = (</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:804: in create_app def delete_document(document_id: int * None = None): ^^^^^^^^^^ E TypeError: unsupported operand type(s) for *: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-17T08:09:09+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T08:09:09+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_db-data Removing Volume softsec-tatou_user-files Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_grafana-data Resource is still in use Volume softsec-tatou_db-data Removed Network softsec-tatou_default Removed time="2025-10-17T08:09:10+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T08:09:10+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for *: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.35s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_214"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_214_1" aria-expanded="false" aria-controls="job_list___sub_collapse_214_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_214_1"><button class="btn btn-outline-success"><span class="job_id">214 : Job ID 4a745d5928e547ae89841b34fbba7306</span></button></div></a><div aria-labelledby="job_list___sub_heading_214_1" data-parent="#job_list___sub_accordion_214" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_214_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=909" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (909, 42), end pos: (909, 43)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -906,7 +906,7 @@ @app.post("/api/create-watermark") @app.post("/api/create-watermark/&lt;int:document_id&gt;") @require_auth - def create_watermark(document_id: int | None = None): + def create_watermark(document_id: int * None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on GET if not document_id: document_id = (</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:909: in create_app def create_watermark(document_id: int * None = None): ^^^^^^^^^^ E TypeError: unsupported operand type(s) for *: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-17T07:06:50+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T07:06:50+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_user-files Removing Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_user-files Resource is still in use Volume softsec-tatou_db-data Removed Network softsec-tatou_default Removed time="2025-10-17T07:06:51+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T07:06:51+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for *: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.71s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_215"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_215_1" aria-expanded="false" aria-controls="job_list___sub_collapse_215_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_215_1"><button class="btn btn-outline-success"><span class="job_id">215 : Job ID 2600e96336cb489ca17f1b3a8525726c</span></button></div></a><div aria-labelledby="job_list___sub_heading_215_1" data-parent="#job_list___sub_accordion_215" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_215_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1024" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1024, 47), end pos: (1024, 48)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1021,7 +1021,7 @@ position=position, ) observe_watermark_duration(method, time.time() - _wm_start) - if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: + if not isinstance(wm_bytes, (bytes * bytearray)) or len(wm_bytes) == 0: inc_watermark_failed(method, "empty_output") app.logger.error( "Watermarking produced no output for document %s using method %s",</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T031437387921Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T031438363068Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 20.22s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_216"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_216_1" aria-expanded="false" aria-controls="job_list___sub_collapse_216_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_216_1"><button class="btn btn-outline-success"><span class="job_id">216 : Job ID 0d6a66f55de6423481c082d0d5ffbbc6</span></button></div></a><div aria-labelledby="job_list___sub_heading_216_1" data-parent="#job_list___sub_accordion_216" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_216_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1146" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1146, 40), end pos: (1146, 41)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1143,7 +1143,7 @@ @app.post("/api/read-watermark") @app.post("/api/read-watermark/&lt;int:document_id&gt;") @require_auth - def read_watermark(document_id: int | None = None): + def read_watermark(document_id: int * None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on POST if not document_id: document_id = (</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:1146: in create_app def read_watermark(document_id: int * None = None): ^^^^^^^^^^ E TypeError: unsupported operand type(s) for *: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T20:59:00+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T20:59:00+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_user-files Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_db-data Removed Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removed time="2025-10-16T20:59:01+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T20:59:01+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for *: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.43s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_217"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_217_1" aria-expanded="false" aria-controls="job_list___sub_collapse_217_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_217_1"><button class="btn btn-outline-success"><span class="job_id">217 : Job ID 424c300862204bb2ba12beda15ce524e</span></button></div></a><div aria-labelledby="job_list___sub_heading_217_1" data-parent="#job_list___sub_accordion_217" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_217_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=456" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (456, 39), end pos: (456, 40)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -453,7 +453,7 @@ @app.get("/api/list-versions") @app.get("/api/list-versions/&lt;int:document_id&gt;") @require_auth - def list_versions(document_id: int | None = None): + def list_versions(document_id: int / None = None): # Input validation if document_id is None: document_id = request.args.get("id") or request.args.get("documentid")</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:456: in create_app def list_versions(document_id: int / None = None): ^^^^^^^^^^ E TypeError: unsupported operand type(s) for /: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-17T05:03:11+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T05:03:11+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_db-data Removing Volume softsec-tatou_user-files Removing Volume softsec-tatou_grafana-data Removing Network softsec-tatou_default Removing Volume softsec-tatou_db-data Removed Volume softsec-tatou_user-files Resource is still in use Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removed time="2025-10-17T05:03:12+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T05:03:12+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for /: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.26s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_218"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_218_1" aria-expanded="false" aria-controls="job_list___sub_collapse_218_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_218_1"><button class="btn btn-outline-success"><span class="job_id">218 : Job ID f27607fb49e04e6fad8f23eedd052f67</span></button></div></a><div aria-labelledby="job_list___sub_heading_218_1" data-parent="#job_list___sub_accordion_218" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_218_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=573" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (573, 38), end pos: (573, 39)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -570,7 +570,7 @@ @app.get("/api/get-document") @app.get("/api/get-document/&lt;int:document_id&gt;") @require_auth - def get_document(document_id: int | None = None): + def get_document(document_id: int / None = None): # Support both path param and ?id=/ ?documentid= if document_id is None: document_id = request.args.get("id") or request.args.get("documentid")</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:573: in create_app def get_document(document_id: int / None = None): ^^^^^^^^^^ E TypeError: unsupported operand type(s) for /: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T17:10:49+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T17:10:49+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_user-files Removing Network softsec-tatou_default Removing Volume softsec-tatou_grafana-data Resource is still in use Volume softsec-tatou_user-files Resource is still in use Volume softsec-tatou_db-data Removed Network softsec-tatou_default Removed time="2025-10-16T17:10:50+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T17:10:50+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for /: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.22s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_219"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_219_1" aria-expanded="false" aria-controls="job_list___sub_collapse_219_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_219_1"><button class="btn btn-outline-success"><span class="job_id">219 : Job ID 1680bc11765c4365a1491040785c9945</span></button></div></a><div aria-labelledby="job_list___sub_heading_219_1" data-parent="#job_list___sub_accordion_219" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_219_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=804" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (804, 41), end pos: (804, 42)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -801,7 +801,7 @@ @app.route("/api/delete-document", methods=["DELETE", "POST"]) @app.route("/api/delete-document/&lt;document_id&gt;", methods=["DELETE"]) @require_auth - def delete_document(document_id: int | None = None): + def delete_document(document_id: int / None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on POST if document_id in (None, ""): document_id = (</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:804: in create_app def delete_document(document_id: int / None = None): ^^^^^^^^^^ E TypeError: unsupported operand type(s) for /: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T20:15:41+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T20:15:41+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_db-data Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_user-files Removing Network softsec-tatou_default Removing Volume softsec-tatou_db-data Removed Volume softsec-tatou_grafana-data Resource is still in use Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removed time="2025-10-16T20:15:42+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T20:15:42+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for /: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.56s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_220"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_220_1" aria-expanded="false" aria-controls="job_list___sub_collapse_220_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_220_1"><button class="btn btn-outline-success"><span class="job_id">220 : Job ID 025a6d19e9ad40c598d2841f0bd0f629</span></button></div></a><div aria-labelledby="job_list___sub_heading_220_1" data-parent="#job_list___sub_accordion_220" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_220_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=909" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (909, 42), end pos: (909, 43)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -906,7 +906,7 @@ @app.post("/api/create-watermark") @app.post("/api/create-watermark/&lt;int:document_id&gt;") @require_auth - def create_watermark(document_id: int | None = None): + def create_watermark(document_id: int / None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on GET if not document_id: document_id = (</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:909: in create_app def create_watermark(document_id: int / None = None): ^^^^^^^^^^ E TypeError: unsupported operand type(s) for /: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-17T08:14:41+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T08:14:41+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_user-files Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_grafana-data Resource is still in use Volume softsec-tatou_db-data Removed Network softsec-tatou_default Removed time="2025-10-17T08:14:42+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T08:14:43+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for /: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.59s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_221"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_221_1" aria-expanded="false" aria-controls="job_list___sub_collapse_221_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_221_1"><button class="btn btn-outline-success"><span class="job_id">221 : Job ID 0d3d7596da2f4ca7966f2f5d679c778b</span></button></div></a><div aria-labelledby="job_list___sub_heading_221_1" data-parent="#job_list___sub_accordion_221" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_221_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1024" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1024, 47), end pos: (1024, 48)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1021,7 +1021,7 @@ position=position, ) observe_watermark_duration(method, time.time() - _wm_start) - if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: + if not isinstance(wm_bytes, (bytes / bytearray)) or len(wm_bytes) == 0: inc_watermark_failed(method, "empty_output") app.logger.error( "Watermarking produced no output for document %s using method %s",</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1034 Watermarking failed for document 1 using method robust-xmp: unsupported operand type(s) for /: 'type' and 'type' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 1 failed, 13 passed, 22 warnings in 20.09s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_222"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_222_1" aria-expanded="false" aria-controls="job_list___sub_collapse_222_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_222_1"><button class="btn btn-outline-success"><span class="job_id">222 : Job ID 32f0aeef94f0451cb4da314eee4f3d99</span></button></div></a><div aria-labelledby="job_list___sub_heading_222_1" data-parent="#job_list___sub_accordion_222" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_222_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1146" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1146, 40), end pos: (1146, 41)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1143,7 +1143,7 @@ @app.post("/api/read-watermark") @app.post("/api/read-watermark/&lt;int:document_id&gt;") @require_auth - def read_watermark(document_id: int | None = None): + def read_watermark(document_id: int / None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on POST if not document_id: document_id = (</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:1146: in create_app def read_watermark(document_id: int / None = None): ^^^^^^^^^^ E TypeError: unsupported operand type(s) for /: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T19:03:29+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T19:03:29+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_user-files Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_user-files Resource is still in use Volume softsec-tatou_db-data Removed Network softsec-tatou_default Removed time="2025-10-16T19:03:30+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T19:03:30+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for /: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.22s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_223"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_223_1" aria-expanded="false" aria-controls="job_list___sub_collapse_223_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_223_1"><button class="btn btn-outline-success"><span class="job_id">223 : Job ID 9a24fb7b50a540c3971c6cec8f31a109</span></button></div></a><div aria-labelledby="job_list___sub_heading_223_1" data-parent="#job_list___sub_accordion_223" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_223_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=456" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (456, 39), end pos: (456, 40)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -453,7 +453,7 @@ @app.get("/api/list-versions") @app.get("/api/list-versions/&lt;int:document_id&gt;") @require_auth - def list_versions(document_id: int | None = None): + def list_versions(document_id: int // None = None): # Input validation if document_id is None: document_id = request.args.get("id") or request.args.get("documentid")</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:456: in create_app def list_versions(document_id: int // None = None): ^^^^^^^^^^^ E TypeError: unsupported operand type(s) for //: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T18:38:18+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T18:38:18+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_db-data Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_user-files Removing Network softsec-tatou_default Removing Volume softsec-tatou_db-data Removed Volume softsec-tatou_user-files Resource is still in use Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removed time="2025-10-16T18:38:19+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T18:38:19+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for //: 't... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.15s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_224"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_224_1" aria-expanded="false" aria-controls="job_list___sub_collapse_224_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_224_1"><button class="btn btn-outline-success"><span class="job_id">224 : Job ID 493e4eb5b63f4cf4a7273b6c454ce514</span></button></div></a><div aria-labelledby="job_list___sub_heading_224_1" data-parent="#job_list___sub_accordion_224" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_224_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=573" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (573, 38), end pos: (573, 39)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -570,7 +570,7 @@ @app.get("/api/get-document") @app.get("/api/get-document/&lt;int:document_id&gt;") @require_auth - def get_document(document_id: int | None = None): + def get_document(document_id: int // None = None): # Support both path param and ?id=/ ?documentid= if document_id is None: document_id = request.args.get("id") or request.args.get("documentid")</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:573: in create_app def get_document(document_id: int // None = None): ^^^^^^^^^^^ E TypeError: unsupported operand type(s) for //: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T16:31:13+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T16:31:13+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_user-files Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_user-files Resource is still in use Volume softsec-tatou_db-data Removed Network softsec-tatou_default Removed time="2025-10-16T16:31:14+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T16:31:14+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for //: 't... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.32s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_225"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_225_1" aria-expanded="false" aria-controls="job_list___sub_collapse_225_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_225_1"><button class="btn btn-outline-success"><span class="job_id">225 : Job ID dfa9c1fe9e1f4d51b3f19084123bcd78</span></button></div></a><div aria-labelledby="job_list___sub_heading_225_1" data-parent="#job_list___sub_accordion_225" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_225_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=804" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (804, 41), end pos: (804, 42)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -801,7 +801,7 @@ @app.route("/api/delete-document", methods=["DELETE", "POST"]) @app.route("/api/delete-document/&lt;document_id&gt;", methods=["DELETE"]) @require_auth - def delete_document(document_id: int | None = None): + def delete_document(document_id: int // None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on POST if document_id in (None, ""): document_id = (</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:804: in create_app def delete_document(document_id: int // None = None): ^^^^^^^^^^^ E TypeError: unsupported operand type(s) for //: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-17T01:18:00+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T01:18:00+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_user-files Removing Volume softsec-tatou_grafana-data Resource is still in use Volume softsec-tatou_db-data Removed Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removing Network softsec-tatou_default Removed time="2025-10-17T01:18:01+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T01:18:01+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for //: 't... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.10s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_226"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_226_1" aria-expanded="false" aria-controls="job_list___sub_collapse_226_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_226_1"><button class="btn btn-outline-success"><span class="job_id">226 : Job ID d43fe2443fd34de8b02c67060131a0eb</span></button></div></a><div aria-labelledby="job_list___sub_heading_226_1" data-parent="#job_list___sub_accordion_226" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_226_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=909" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (909, 42), end pos: (909, 43)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -906,7 +906,7 @@ @app.post("/api/create-watermark") @app.post("/api/create-watermark/&lt;int:document_id&gt;") @require_auth - def create_watermark(document_id: int | None = None): + def create_watermark(document_id: int // None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on GET if not document_id: document_id = (</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:909: in create_app def create_watermark(document_id: int // None = None): ^^^^^^^^^^^ E TypeError: unsupported operand type(s) for //: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T18:50:35+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T18:50:35+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_db-data Removing Volume softsec-tatou_user-files Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_grafana-data Resource is still in use Volume softsec-tatou_db-data Removed Network softsec-tatou_default Removed time="2025-10-16T18:50:36+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T18:50:36+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for //: 't... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.11s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_227"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_227_1" aria-expanded="false" aria-controls="job_list___sub_collapse_227_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_227_1"><button class="btn btn-outline-success"><span class="job_id">227 : Job ID 85349364872a4e7c92c275a45e941e46</span></button></div></a><div aria-labelledby="job_list___sub_heading_227_1" data-parent="#job_list___sub_accordion_227" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_227_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1024" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1024, 47), end pos: (1024, 48)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1021,7 +1021,7 @@ position=position, ) observe_watermark_duration(method, time.time() - _wm_start) - if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: + if not isinstance(wm_bytes, (bytes // bytearray)) or len(wm_bytes) == 0: inc_watermark_failed(method, "empty_output") app.logger.error( "Watermarking produced no output for document %s using method %s",</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1034 Watermarking failed for document 1 using method robust-xmp: unsupported operand type(s) for //: 'type' and 'type' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 1 failed, 13 passed, 22 warnings in 19.83s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_228"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_228_1" aria-expanded="false" aria-controls="job_list___sub_collapse_228_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_228_1"><button class="btn btn-outline-success"><span class="job_id">228 : Job ID b79e5ce751684e4f93b495584ab0f508</span></button></div></a><div aria-labelledby="job_list___sub_heading_228_1" data-parent="#job_list___sub_accordion_228" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_228_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1146" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1146, 40), end pos: (1146, 41)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1143,7 +1143,7 @@ @app.post("/api/read-watermark") @app.post("/api/read-watermark/&lt;int:document_id&gt;") @require_auth - def read_watermark(document_id: int | None = None): + def read_watermark(document_id: int // None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on POST if not document_id: document_id = (</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:1146: in create_app def read_watermark(document_id: int // None = None): ^^^^^^^^^^^ E TypeError: unsupported operand type(s) for //: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T18:01:03+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T18:01:03+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_db-data Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_user-files Removing Network softsec-tatou_default Removing Volume softsec-tatou_db-data Removed Volume softsec-tatou_grafana-data Resource is still in use Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removed time="2025-10-16T18:01:04+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T18:01:04+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for //: 't... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.21s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_229"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_229_1" aria-expanded="false" aria-controls="job_list___sub_collapse_229_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_229_1"><button class="btn btn-outline-success"><span class="job_id">229 : Job ID 4db2d3eae4e74f55a9afdba8b4b303c9</span></button></div></a><div aria-labelledby="job_list___sub_heading_229_1" data-parent="#job_list___sub_accordion_229" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_229_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=456" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (456, 39), end pos: (456, 40)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -453,7 +453,7 @@ @app.get("/api/list-versions") @app.get("/api/list-versions/&lt;int:document_id&gt;") @require_auth - def list_versions(document_id: int | None = None): + def list_versions(document_id: int % None = None): # Input validation if document_id is None: document_id = request.args.get("id") or request.args.get("documentid")</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:456: in create_app def list_versions(document_id: int % None = None): ^^^^^^^^^^ E TypeError: unsupported operand type(s) for %: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T17:55:40+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T17:55:40+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_db-data Removing Volume softsec-tatou_user-files Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_db-data Removed Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removed time="2025-10-16T17:55:41+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T17:55:41+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for %: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.12s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_230"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_230_1" aria-expanded="false" aria-controls="job_list___sub_collapse_230_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_230_1"><button class="btn btn-outline-success"><span class="job_id">230 : Job ID 4b7816934800487eafbe51fcfc0dde19</span></button></div></a><div aria-labelledby="job_list___sub_heading_230_1" data-parent="#job_list___sub_accordion_230" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_230_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=573" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (573, 38), end pos: (573, 39)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -570,7 +570,7 @@ @app.get("/api/get-document") @app.get("/api/get-document/&lt;int:document_id&gt;") @require_auth - def get_document(document_id: int | None = None): + def get_document(document_id: int % None = None): # Support both path param and ?id=/ ?documentid= if document_id is None: document_id = request.args.get("id") or request.args.get("documentid")</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:573: in create_app def get_document(document_id: int % None = None): ^^^^^^^^^^ E TypeError: unsupported operand type(s) for %: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T19:54:04+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T19:54:04+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_user-files Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_db-data Removed Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removed time="2025-10-16T19:54:05+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T19:54:05+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for %: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.24s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_231"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_231_1" aria-expanded="false" aria-controls="job_list___sub_collapse_231_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_231_1"><button class="btn btn-outline-success"><span class="job_id">231 : Job ID 92294a7306124f1fbbbfae65e8994e72</span></button></div></a><div aria-labelledby="job_list___sub_heading_231_1" data-parent="#job_list___sub_accordion_231" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_231_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=804" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (804, 41), end pos: (804, 42)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -801,7 +801,7 @@ @app.route("/api/delete-document", methods=["DELETE", "POST"]) @app.route("/api/delete-document/&lt;document_id&gt;", methods=["DELETE"]) @require_auth - def delete_document(document_id: int | None = None): + def delete_document(document_id: int % None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on POST if document_id in (None, ""): document_id = (</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:804: in create_app def delete_document(document_id: int % None = None): ^^^^^^^^^^ E TypeError: unsupported operand type(s) for %: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-17T01:55:47+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T01:55:47+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_user-files Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_db-data Removing Network softsec-tatou_default Removing Volume softsec-tatou_grafana-data Resource is still in use Volume softsec-tatou_user-files Resource is still in use Volume softsec-tatou_db-data Removed Network softsec-tatou_default Removed time="2025-10-17T01:55:48+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T01:55:48+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for %: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.18s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_232"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_232_1" aria-expanded="false" aria-controls="job_list___sub_collapse_232_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_232_1"><button class="btn btn-outline-success"><span class="job_id">232 : Job ID 616bdf6d410c4205b1ae035ddd49a534</span></button></div></a><div aria-labelledby="job_list___sub_heading_232_1" data-parent="#job_list___sub_accordion_232" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_232_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=909" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (909, 42), end pos: (909, 43)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -906,7 +906,7 @@ @app.post("/api/create-watermark") @app.post("/api/create-watermark/&lt;int:document_id&gt;") @require_auth - def create_watermark(document_id: int | None = None): + def create_watermark(document_id: int % None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on GET if not document_id: document_id = (</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:909: in create_app def create_watermark(document_id: int % None = None): ^^^^^^^^^^ E TypeError: unsupported operand type(s) for %: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T16:54:44+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T16:54:44+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_db-data Removing Volume softsec-tatou_user-files Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_db-data Removed Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removed time="2025-10-16T16:54:45+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T16:54:45+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for %: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.22s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_233"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_233_1" aria-expanded="false" aria-controls="job_list___sub_collapse_233_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_233_1"><button class="btn btn-outline-success"><span class="job_id">233 : Job ID c384697b3e7843a3a9dec6a181f8e677</span></button></div></a><div aria-labelledby="job_list___sub_heading_233_1" data-parent="#job_list___sub_accordion_233" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_233_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1024" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1024, 47), end pos: (1024, 48)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1021,7 +1021,7 @@ position=position, ) observe_watermark_duration(method, time.time() - _wm_start) - if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: + if not isinstance(wm_bytes, (bytes % bytearray)) or len(wm_bytes) == 0: inc_watermark_failed(method, "empty_output") app.logger.error( "Watermarking produced no output for document %s using method %s",</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1034 Watermarking failed for document 1 using method robust-xmp: unsupported operand type(s) for %: 'type' and 'type' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 1 failed, 13 passed, 22 warnings in 20.57s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_234"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_234_1" aria-expanded="false" aria-controls="job_list___sub_collapse_234_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_234_1"><button class="btn btn-outline-success"><span class="job_id">234 : Job ID 5016c52005424ce78579286eb820f66c</span></button></div></a><div aria-labelledby="job_list___sub_heading_234_1" data-parent="#job_list___sub_accordion_234" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_234_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1146" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1146, 40), end pos: (1146, 41)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1143,7 +1143,7 @@ @app.post("/api/read-watermark") @app.post("/api/read-watermark/&lt;int:document_id&gt;") @require_auth - def read_watermark(document_id: int | None = None): + def read_watermark(document_id: int % None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on POST if not document_id: document_id = (</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:1146: in create_app def read_watermark(document_id: int % None = None): ^^^^^^^^^^ E TypeError: unsupported operand type(s) for %: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-17T06:19:23+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T06:19:23+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_user-files Removing Volume softsec-tatou_db-data Removing Network softsec-tatou_default Removing Volume softsec-tatou_db-data Removed Volume softsec-tatou_grafana-data Resource is still in use Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removed time="2025-10-17T06:19:24+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T06:19:24+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for %: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 14.51s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_235"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_235_1" aria-expanded="false" aria-controls="job_list___sub_collapse_235_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_235_1"><button class="btn btn-outline-success"><span class="job_id">235 : Job ID 3afae04e1dfe4b59b96c972b89045c8f</span></button></div></a><div aria-labelledby="job_list___sub_heading_235_1" data-parent="#job_list___sub_accordion_235" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_235_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=456" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (456, 39), end pos: (456, 40)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -453,7 +453,7 @@ @app.get("/api/list-versions") @app.get("/api/list-versions/&lt;int:document_id&gt;") @require_auth - def list_versions(document_id: int | None = None): + def list_versions(document_id: int ** None = None): # Input validation if document_id is None: document_id = request.args.get("id") or request.args.get("documentid")</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:456: in create_app def list_versions(document_id: int ** None = None): ^^^^^^^^^^^ E TypeError: unsupported operand type(s) for ** or pow(): 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T23:30:34+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T23:30:34+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_user-files Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_user-files Resource is still in use Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_db-data Removed Network softsec-tatou_default Removed time="2025-10-16T23:30:35+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T23:30:35+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for ** or ... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.11s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_236"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_236_1" aria-expanded="false" aria-controls="job_list___sub_collapse_236_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_236_1"><button class="btn btn-outline-success"><span class="job_id">236 : Job ID effedd299dcd49a1a5c62b58013e870f</span></button></div></a><div aria-labelledby="job_list___sub_heading_236_1" data-parent="#job_list___sub_accordion_236" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_236_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=573" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (573, 38), end pos: (573, 39)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -570,7 +570,7 @@ @app.get("/api/get-document") @app.get("/api/get-document/&lt;int:document_id&gt;") @require_auth - def get_document(document_id: int | None = None): + def get_document(document_id: int ** None = None): # Support both path param and ?id=/ ?documentid= if document_id is None: document_id = request.args.get("id") or request.args.get("documentid")</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:573: in create_app def get_document(document_id: int ** None = None): ^^^^^^^^^^^ E TypeError: unsupported operand type(s) for ** or pow(): 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T19:10:27+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T19:10:28+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_user-files Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_db-data Removed Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removed time="2025-10-16T19:10:29+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T19:10:29+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for ** or ... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.19s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_237"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_237_1" aria-expanded="false" aria-controls="job_list___sub_collapse_237_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_237_1"><button class="btn btn-outline-success"><span class="job_id">237 : Job ID a93c93bd4136404bb4e2faa4dc88eb5b</span></button></div></a><div aria-labelledby="job_list___sub_heading_237_1" data-parent="#job_list___sub_accordion_237" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_237_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=804" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (804, 41), end pos: (804, 42)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -801,7 +801,7 @@ @app.route("/api/delete-document", methods=["DELETE", "POST"]) @app.route("/api/delete-document/&lt;document_id&gt;", methods=["DELETE"]) @require_auth - def delete_document(document_id: int | None = None): + def delete_document(document_id: int ** None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on POST if document_id in (None, ""): document_id = (</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:804: in create_app def delete_document(document_id: int ** None = None): ^^^^^^^^^^^ E TypeError: unsupported operand type(s) for ** or pow(): 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T16:54:09+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T16:54:09+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_db-data Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_user-files Removing Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_db-data Removed Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removed time="2025-10-16T16:54:10+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T16:54:10+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for ** or ... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.16s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_238"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_238_1" aria-expanded="false" aria-controls="job_list___sub_collapse_238_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_238_1"><button class="btn btn-outline-success"><span class="job_id">238 : Job ID 425da05da64841d393209e69d4a662a8</span></button></div></a><div aria-labelledby="job_list___sub_heading_238_1" data-parent="#job_list___sub_accordion_238" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_238_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=909" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (909, 42), end pos: (909, 43)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -906,7 +906,7 @@ @app.post("/api/create-watermark") @app.post("/api/create-watermark/&lt;int:document_id&gt;") @require_auth - def create_watermark(document_id: int | None = None): + def create_watermark(document_id: int ** None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on GET if not document_id: document_id = (</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:909: in create_app def create_watermark(document_id: int ** None = None): ^^^^^^^^^^^ E TypeError: unsupported operand type(s) for ** or pow(): 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T21:09:37+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T21:09:37+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_user-files Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_grafana-data Resource is still in use Volume softsec-tatou_db-data Removed Network softsec-tatou_default Removed time="2025-10-16T21:09:38+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T21:09:38+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for ** or ... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.38s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_239"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_239_1" aria-expanded="false" aria-controls="job_list___sub_collapse_239_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_239_1"><button class="btn btn-outline-success"><span class="job_id">239 : Job ID fd66efbad23943b39bc5462a9039bfb2</span></button></div></a><div aria-labelledby="job_list___sub_heading_239_1" data-parent="#job_list___sub_accordion_239" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_239_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1024" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1024, 47), end pos: (1024, 48)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1021,7 +1021,7 @@ position=position, ) observe_watermark_duration(method, time.time() - _wm_start) - if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: + if not isinstance(wm_bytes, (bytes ** bytearray)) or len(wm_bytes) == 0: inc_watermark_failed(method, "empty_output") app.logger.error( "Watermarking produced no output for document %s using method %s",</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1034 Watermarking failed for document 1 using method robust-xmp: unsupported operand type(s) for ** or pow(): 'type' and 'type' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 1 failed, 13 passed, 22 warnings in 20.17s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_240"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_240_1" aria-expanded="false" aria-controls="job_list___sub_collapse_240_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_240_1"><button class="btn btn-outline-success"><span class="job_id">240 : Job ID 7d3b290e54a7489bbf089bbfcce590ee</span></button></div></a><div aria-labelledby="job_list___sub_heading_240_1" data-parent="#job_list___sub_accordion_240" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_240_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1146" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1146, 40), end pos: (1146, 41)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1143,7 +1143,7 @@ @app.post("/api/read-watermark") @app.post("/api/read-watermark/&lt;int:document_id&gt;") @require_auth - def read_watermark(document_id: int | None = None): + def read_watermark(document_id: int ** None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on POST if not document_id: document_id = (</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:1146: in create_app def read_watermark(document_id: int ** None = None): ^^^^^^^^^^^ E TypeError: unsupported operand type(s) for ** or pow(): 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-17T03:16:41+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T03:16:41+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_db-data Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_user-files Removing Network softsec-tatou_default Removing Volume softsec-tatou_db-data Removed Volume softsec-tatou_user-files Resource is still in use Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removed time="2025-10-17T03:16:42+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T03:16:42+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for ** or ... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.34s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_241"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_241_1" aria-expanded="false" aria-controls="job_list___sub_collapse_241_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_241_1"><button class="btn btn-outline-success"><span class="job_id">241 : Job ID 5bbaa5b75baf4733a5be7ac69ffeb615</span></button></div></a><div aria-labelledby="job_list___sub_heading_241_1" data-parent="#job_list___sub_accordion_241" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_241_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=456" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (456, 39), end pos: (456, 40)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -453,7 +453,7 @@ @app.get("/api/list-versions") @app.get("/api/list-versions/&lt;int:document_id&gt;") @require_auth - def list_versions(document_id: int | None = None): + def list_versions(document_id: int &gt;&gt; None = None): # Input validation if document_id is None: document_id = request.args.get("id") or request.args.get("documentid")</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:456: in create_app def list_versions(document_id: int &gt;&gt; None = None): ^^^^^^^^^^^ E TypeError: unsupported operand type(s) for &gt;&gt;: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T20:54:28+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T20:54:28+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_user-files Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_grafana-data Resource is still in use Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_db-data Removed Network softsec-tatou_default Removed time="2025-10-16T20:54:29+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T20:54:29+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for &gt;&gt;: 't... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.46s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_242"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_242_1" aria-expanded="false" aria-controls="job_list___sub_collapse_242_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_242_1"><button class="btn btn-outline-success"><span class="job_id">242 : Job ID cae76ce924454d3cbbf00206e0f63759</span></button></div></a><div aria-labelledby="job_list___sub_heading_242_1" data-parent="#job_list___sub_accordion_242" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_242_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=573" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (573, 38), end pos: (573, 39)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -570,7 +570,7 @@ @app.get("/api/get-document") @app.get("/api/get-document/&lt;int:document_id&gt;") @require_auth - def get_document(document_id: int | None = None): + def get_document(document_id: int &gt;&gt; None = None): # Support both path param and ?id=/ ?documentid= if document_id is None: document_id = request.args.get("id") or request.args.get("documentid")</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:573: in create_app def get_document(document_id: int &gt;&gt; None = None): ^^^^^^^^^^^ E TypeError: unsupported operand type(s) for &gt;&gt;: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-17T04:18:22+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T04:18:22+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_user-files Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_user-files Resource is still in use Volume softsec-tatou_db-data Removed Network softsec-tatou_default Removed time="2025-10-17T04:18:23+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T04:18:23+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for &gt;&gt;: 't... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.12s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_243"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_243_1" aria-expanded="false" aria-controls="job_list___sub_collapse_243_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_243_1"><button class="btn btn-outline-success"><span class="job_id">243 : Job ID 58fd843dc7184a0fb158fdf72614872f</span></button></div></a><div aria-labelledby="job_list___sub_heading_243_1" data-parent="#job_list___sub_accordion_243" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_243_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=804" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (804, 41), end pos: (804, 42)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -801,7 +801,7 @@ @app.route("/api/delete-document", methods=["DELETE", "POST"]) @app.route("/api/delete-document/&lt;document_id&gt;", methods=["DELETE"]) @require_auth - def delete_document(document_id: int | None = None): + def delete_document(document_id: int &gt;&gt; None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on POST if document_id in (None, ""): document_id = (</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:804: in create_app def delete_document(document_id: int &gt;&gt; None = None): ^^^^^^^^^^^ E TypeError: unsupported operand type(s) for &gt;&gt;: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-17T01:36:28+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T01:36:29+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_user-files Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_db-data Removed Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removed time="2025-10-17T01:36:29+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T01:36:30+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for &gt;&gt;: 't... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.10s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_244"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_244_1" aria-expanded="false" aria-controls="job_list___sub_collapse_244_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_244_1"><button class="btn btn-outline-success"><span class="job_id">244 : Job ID 4001ea9df8664653a1d9a91e605296ac</span></button></div></a><div aria-labelledby="job_list___sub_heading_244_1" data-parent="#job_list___sub_accordion_244" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_244_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=909" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (909, 42), end pos: (909, 43)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -906,7 +906,7 @@ @app.post("/api/create-watermark") @app.post("/api/create-watermark/&lt;int:document_id&gt;") @require_auth - def create_watermark(document_id: int | None = None): + def create_watermark(document_id: int &gt;&gt; None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on GET if not document_id: document_id = (</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:909: in create_app def create_watermark(document_id: int &gt;&gt; None = None): ^^^^^^^^^^^ E TypeError: unsupported operand type(s) for &gt;&gt;: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-17T06:48:03+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T06:48:03+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_db-data Removing Volume softsec-tatou_user-files Removing Volume softsec-tatou_grafana-data Removing Network softsec-tatou_default Removing Volume softsec-tatou_grafana-data Resource is still in use Volume softsec-tatou_db-data Removed Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removed time="2025-10-17T06:48:04+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T06:48:04+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for &gt;&gt;: 't... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.55s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_245"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_245_1" aria-expanded="false" aria-controls="job_list___sub_collapse_245_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_245_1"><button class="btn btn-outline-success"><span class="job_id">245 : Job ID dc1cee77f61c46c398a4af2ab1530a66</span></button></div></a><div aria-labelledby="job_list___sub_heading_245_1" data-parent="#job_list___sub_accordion_245" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_245_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1024" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1024, 47), end pos: (1024, 48)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1021,7 +1021,7 @@ position=position, ) observe_watermark_duration(method, time.time() - _wm_start) - if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: + if not isinstance(wm_bytes, (bytes &gt;&gt; bytearray)) or len(wm_bytes) == 0: inc_watermark_failed(method, "empty_output") app.logger.error( "Watermarking produced no output for document %s using method %s",</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1034 Watermarking failed for document 1 using method robust-xmp: unsupported operand type(s) for &gt;&gt;: 'type' and 'type' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 1 failed, 13 passed, 22 warnings in 20.23s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_246"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_246_1" aria-expanded="false" aria-controls="job_list___sub_collapse_246_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_246_1"><button class="btn btn-outline-success"><span class="job_id">246 : Job ID a0bbccb743534fa8ad465b782385c36a</span></button></div></a><div aria-labelledby="job_list___sub_heading_246_1" data-parent="#job_list___sub_accordion_246" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_246_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1146" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1146, 40), end pos: (1146, 41)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1143,7 +1143,7 @@ @app.post("/api/read-watermark") @app.post("/api/read-watermark/&lt;int:document_id&gt;") @require_auth - def read_watermark(document_id: int | None = None): + def read_watermark(document_id: int &gt;&gt; None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on POST if not document_id: document_id = (</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:1146: in create_app def read_watermark(document_id: int &gt;&gt; None = None): ^^^^^^^^^^^ E TypeError: unsupported operand type(s) for &gt;&gt;: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T17:30:13+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T17:30:13+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_user-files Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_db-data Removed Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removed time="2025-10-16T17:30:14+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T17:30:14+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for &gt;&gt;: 't... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.03s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_247"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_247_1" aria-expanded="false" aria-controls="job_list___sub_collapse_247_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_247_1"><button class="btn btn-outline-success"><span class="job_id">247 : Job ID 104eab2a669d4ba79062ee7a5f2e65c8</span></button></div></a><div aria-labelledby="job_list___sub_heading_247_1" data-parent="#job_list___sub_accordion_247" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_247_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=456" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (456, 39), end pos: (456, 40)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -453,7 +453,7 @@ @app.get("/api/list-versions") @app.get("/api/list-versions/&lt;int:document_id&gt;") @require_auth - def list_versions(document_id: int | None = None): + def list_versions(document_id: int &lt;&lt; None = None): # Input validation if document_id is None: document_id = request.args.get("id") or request.args.get("documentid")</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:456: in create_app def list_versions(document_id: int &lt;&lt; None = None): ^^^^^^^^^^^ E TypeError: unsupported operand type(s) for &lt;&lt;: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T19:33:52+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T19:33:52+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_user-files Removing Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_db-data Removed Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removed time="2025-10-16T19:33:53+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T19:33:53+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for &lt;&lt;: 't... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.20s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_248"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_248_1" aria-expanded="false" aria-controls="job_list___sub_collapse_248_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_248_1"><button class="btn btn-outline-success"><span class="job_id">248 : Job ID c7dafaedefa14253a24ae6772795f4fc</span></button></div></a><div aria-labelledby="job_list___sub_heading_248_1" data-parent="#job_list___sub_accordion_248" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_248_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=573" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (573, 38), end pos: (573, 39)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -570,7 +570,7 @@ @app.get("/api/get-document") @app.get("/api/get-document/&lt;int:document_id&gt;") @require_auth - def get_document(document_id: int | None = None): + def get_document(document_id: int &lt;&lt; None = None): # Support both path param and ?id=/ ?documentid= if document_id is None: document_id = request.args.get("id") or request.args.get("documentid")</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:573: in create_app def get_document(document_id: int &lt;&lt; None = None): ^^^^^^^^^^^ E TypeError: unsupported operand type(s) for &lt;&lt;: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T23:17:06+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T23:17:06+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_db-data Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_user-files Removing Network softsec-tatou_default Removing Volume softsec-tatou_db-data Removed Volume softsec-tatou_user-files Resource is still in use Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removed time="2025-10-16T23:17:07+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T23:17:07+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for &lt;&lt;: 't... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.23s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_249"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_249_1" aria-expanded="false" aria-controls="job_list___sub_collapse_249_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_249_1"><button class="btn btn-outline-success"><span class="job_id">249 : Job ID 94046b7d76c74ea6a859e123627db709</span></button></div></a><div aria-labelledby="job_list___sub_heading_249_1" data-parent="#job_list___sub_accordion_249" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_249_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=804" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (804, 41), end pos: (804, 42)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -801,7 +801,7 @@ @app.route("/api/delete-document", methods=["DELETE", "POST"]) @app.route("/api/delete-document/&lt;document_id&gt;", methods=["DELETE"]) @require_auth - def delete_document(document_id: int | None = None): + def delete_document(document_id: int &lt;&lt; None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on POST if document_id in (None, ""): document_id = (</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:804: in create_app def delete_document(document_id: int &lt;&lt; None = None): ^^^^^^^^^^^ E TypeError: unsupported operand type(s) for &lt;&lt;: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-17T03:35:51+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T03:35:51+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_user-files Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_grafana-data Resource is still in use Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_db-data Removed Network softsec-tatou_default Removed time="2025-10-17T03:35:52+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T03:35:52+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for &lt;&lt;: 't... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.12s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_250"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_250_1" aria-expanded="false" aria-controls="job_list___sub_collapse_250_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_250_1"><button class="btn btn-outline-success"><span class="job_id">250 : Job ID cd60b0e0b7584fb0a175e72456a14366</span></button></div></a><div aria-labelledby="job_list___sub_heading_250_1" data-parent="#job_list___sub_accordion_250" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_250_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=909" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (909, 42), end pos: (909, 43)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -906,7 +906,7 @@ @app.post("/api/create-watermark") @app.post("/api/create-watermark/&lt;int:document_id&gt;") @require_auth - def create_watermark(document_id: int | None = None): + def create_watermark(document_id: int &lt;&lt; None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on GET if not document_id: document_id = (</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:909: in create_app def create_watermark(document_id: int &lt;&lt; None = None): ^^^^^^^^^^^ E TypeError: unsupported operand type(s) for &lt;&lt;: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T22:54:59+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T22:54:59+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_db-data Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_user-files Removing Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_db-data Removed Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removed time="2025-10-16T22:55:00+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T22:55:00+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for &lt;&lt;: 't... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.56s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_251"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_251_1" aria-expanded="false" aria-controls="job_list___sub_collapse_251_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_251_1"><button class="btn btn-outline-success"><span class="job_id">251 : Job ID 35270513bf5e40a1861288bb85122421</span></button></div></a><div aria-labelledby="job_list___sub_heading_251_1" data-parent="#job_list___sub_accordion_251" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_251_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1024" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1024, 47), end pos: (1024, 48)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1021,7 +1021,7 @@ position=position, ) observe_watermark_duration(method, time.time() - _wm_start) - if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: + if not isinstance(wm_bytes, (bytes &lt;&lt; bytearray)) or len(wm_bytes) == 0: inc_watermark_failed(method, "empty_output") app.logger.error( "Watermarking produced no output for document %s using method %s",</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1034 Watermarking failed for document 1 using method robust-xmp: unsupported operand type(s) for &lt;&lt;: 'type' and 'type' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 1 failed, 13 passed, 22 warnings in 20.43s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_252"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_252_1" aria-expanded="false" aria-controls="job_list___sub_collapse_252_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_252_1"><button class="btn btn-outline-success"><span class="job_id">252 : Job ID 5a8811347dab4aa8b845daa937e26e67</span></button></div></a><div aria-labelledby="job_list___sub_heading_252_1" data-parent="#job_list___sub_accordion_252" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_252_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1146" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1146, 40), end pos: (1146, 41)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1143,7 +1143,7 @@ @app.post("/api/read-watermark") @app.post("/api/read-watermark/&lt;int:document_id&gt;") @require_auth - def read_watermark(document_id: int | None = None): + def read_watermark(document_id: int &lt;&lt; None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on POST if not document_id: document_id = (</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:1146: in create_app def read_watermark(document_id: int &lt;&lt; None = None): ^^^^^^^^^^^ E TypeError: unsupported operand type(s) for &lt;&lt;: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T17:41:25+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T17:41:25+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_user-files Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_db-data Removing Network softsec-tatou_default Removing Volume softsec-tatou_user-files Resource is still in use Volume softsec-tatou_db-data Removed Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removed time="2025-10-16T17:41:26+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T17:41:26+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for &lt;&lt;: 't... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.34s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_253"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_253_1" aria-expanded="false" aria-controls="job_list___sub_collapse_253_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_253_1"><button class="btn btn-outline-success"><span class="job_id">253 : Job ID 64d6874cf4b24d5384ee15d0f6c36394</span></button></div></a><div aria-labelledby="job_list___sub_heading_253_1" data-parent="#job_list___sub_accordion_253" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_253_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=456" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (456, 39), end pos: (456, 40)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -453,7 +453,7 @@ @app.get("/api/list-versions") @app.get("/api/list-versions/&lt;int:document_id&gt;") @require_auth - def list_versions(document_id: int | None = None): + def list_versions(document_id: int &amp; None = None): # Input validation if document_id is None: document_id = request.args.get("id") or request.args.get("documentid")</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:456: in create_app def list_versions(document_id: int &amp; None = None): ^^^^^^^^^^ E TypeError: unsupported operand type(s) for &amp;: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T19:15:51+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T19:15:51+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_user-files Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_grafana-data Resource is still in use Volume softsec-tatou_db-data Removed Network softsec-tatou_default Removed time="2025-10-16T19:15:52+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T19:15:52+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for &amp;: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.21s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_254"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_254_1" aria-expanded="false" aria-controls="job_list___sub_collapse_254_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_254_1"><button class="btn btn-outline-success"><span class="job_id">254 : Job ID f55637805ffd4de2831afd7e5aa51f74</span></button></div></a><div aria-labelledby="job_list___sub_heading_254_1" data-parent="#job_list___sub_accordion_254" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_254_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=573" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (573, 38), end pos: (573, 39)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -570,7 +570,7 @@ @app.get("/api/get-document") @app.get("/api/get-document/&lt;int:document_id&gt;") @require_auth - def get_document(document_id: int | None = None): + def get_document(document_id: int &amp; None = None): # Support both path param and ?id=/ ?documentid= if document_id is None: document_id = request.args.get("id") or request.args.get("documentid")</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:573: in create_app def get_document(document_id: int &amp; None = None): ^^^^^^^^^^ E TypeError: unsupported operand type(s) for &amp;: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-17T02:07:56+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T02:07:56+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_db-data Removing Volume softsec-tatou_user-files Removing Volume softsec-tatou_grafana-data Removing Network softsec-tatou_default Removing Volume softsec-tatou_user-files Resource is still in use Volume softsec-tatou_db-data Removed Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removed time="2025-10-17T02:07:57+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T02:07:57+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for &amp;: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.23s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_255"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_255_1" aria-expanded="false" aria-controls="job_list___sub_collapse_255_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_255_1"><button class="btn btn-outline-success"><span class="job_id">255 : Job ID 1133dfda59fc4baebd11d292a8d103df</span></button></div></a><div aria-labelledby="job_list___sub_heading_255_1" data-parent="#job_list___sub_accordion_255" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_255_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=804" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (804, 41), end pos: (804, 42)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -801,7 +801,7 @@ @app.route("/api/delete-document", methods=["DELETE", "POST"]) @app.route("/api/delete-document/&lt;document_id&gt;", methods=["DELETE"]) @require_auth - def delete_document(document_id: int | None = None): + def delete_document(document_id: int &amp; None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on POST if document_id in (None, ""): document_id = (</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:804: in create_app def delete_document(document_id: int &amp; None = None): ^^^^^^^^^^ E TypeError: unsupported operand type(s) for &amp;: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T23:37:07+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T23:37:07+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_user-files Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_user-files Resource is still in use Volume softsec-tatou_db-data Removed Network softsec-tatou_default Removed time="2025-10-16T23:37:08+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T23:37:08+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for &amp;: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.11s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_256"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_256_1" aria-expanded="false" aria-controls="job_list___sub_collapse_256_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_256_1"><button class="btn btn-outline-success"><span class="job_id">256 : Job ID 6760035f76724b66a40dd2fd1c2b2d8c</span></button></div></a><div aria-labelledby="job_list___sub_heading_256_1" data-parent="#job_list___sub_accordion_256" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_256_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=909" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (909, 42), end pos: (909, 43)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -906,7 +906,7 @@ @app.post("/api/create-watermark") @app.post("/api/create-watermark/&lt;int:document_id&gt;") @require_auth - def create_watermark(document_id: int | None = None): + def create_watermark(document_id: int &amp; None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on GET if not document_id: document_id = (</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:909: in create_app def create_watermark(document_id: int &amp; None = None): ^^^^^^^^^^ E TypeError: unsupported operand type(s) for &amp;: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T18:27:04+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T18:27:04+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_db-data Removing Volume softsec-tatou_user-files Removing Volume softsec-tatou_grafana-data Removing Network softsec-tatou_default Removing Volume softsec-tatou_user-files Resource is still in use Volume softsec-tatou_db-data Removed Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removed time="2025-10-16T18:27:05+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T18:27:05+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for &amp;: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.05s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_257"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_257_1" aria-expanded="false" aria-controls="job_list___sub_collapse_257_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_257_1"><button class="btn btn-outline-success"><span class="job_id">257 : Job ID 26051a31ff564571998d8686777d7549</span></button></div></a><div aria-labelledby="job_list___sub_heading_257_1" data-parent="#job_list___sub_accordion_257" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_257_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1024" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1024, 47), end pos: (1024, 48)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1021,7 +1021,7 @@ position=position, ) observe_watermark_duration(method, time.time() - _wm_start) - if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: + if not isinstance(wm_bytes, (bytes &amp; bytearray)) or len(wm_bytes) == 0: inc_watermark_failed(method, "empty_output") app.logger.error( "Watermarking produced no output for document %s using method %s",</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1034 Watermarking failed for document 1 using method robust-xmp: unsupported operand type(s) for &amp;: 'type' and 'type' __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ed0ea412b9753ff31: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.67s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_258"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_258_1" aria-expanded="false" aria-controls="job_list___sub_collapse_258_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_258_1"><button class="btn btn-outline-success"><span class="job_id">258 : Job ID 373dc0993ec34b91a36c190919374a87</span></button></div></a><div aria-labelledby="job_list___sub_heading_258_1" data-parent="#job_list___sub_accordion_258" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_258_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1146" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1146, 40), end pos: (1146, 41)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1143,7 +1143,7 @@ @app.post("/api/read-watermark") @app.post("/api/read-watermark/&lt;int:document_id&gt;") @require_auth - def read_watermark(document_id: int | None = None): + def read_watermark(document_id: int &amp; None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on POST if not document_id: document_id = (</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:1146: in create_app def read_watermark(document_id: int &amp; None = None): ^^^^^^^^^^ E TypeError: unsupported operand type(s) for &amp;: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T18:08:34+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T18:08:34+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_user-files Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_grafana-data Resource is still in use Volume softsec-tatou_db-data Removed Network softsec-tatou_default Removed time="2025-10-16T18:08:35+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T18:08:35+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for &amp;: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.44s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_259"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_259_1" aria-expanded="false" aria-controls="job_list___sub_collapse_259_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_259_1"><button class="btn btn-outline-success"><span class="job_id">259 : Job ID abd37d9d38124ba491e9ae3e578c1141</span></button></div></a><div aria-labelledby="job_list___sub_heading_259_1" data-parent="#job_list___sub_accordion_259" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_259_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=456" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (456, 39), end pos: (456, 40)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -453,7 +453,7 @@ @app.get("/api/list-versions") @app.get("/api/list-versions/&lt;int:document_id&gt;") @require_auth - def list_versions(document_id: int | None = None): + def list_versions(document_id: int ^ None = None): # Input validation if document_id is None: document_id = request.args.get("id") or request.args.get("documentid")</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:456: in create_app def list_versions(document_id: int ^ None = None): ^^^^^^^^^^ E TypeError: unsupported operand type(s) for ^: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-17T06:18:23+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T06:18:23+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_user-files Removing Network softsec-tatou_default Removing Volume softsec-tatou_grafana-data Resource is still in use Volume softsec-tatou_db-data Removed Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removed time="2025-10-17T06:18:24+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T06:18:24+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for ^: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.67s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_260"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_260_1" aria-expanded="false" aria-controls="job_list___sub_collapse_260_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_260_1"><button class="btn btn-outline-success"><span class="job_id">260 : Job ID d2338b0bbb894245800f23f76a63dcd2</span></button></div></a><div aria-labelledby="job_list___sub_heading_260_1" data-parent="#job_list___sub_accordion_260" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_260_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=573" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (573, 38), end pos: (573, 39)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -570,7 +570,7 @@ @app.get("/api/get-document") @app.get("/api/get-document/&lt;int:document_id&gt;") @require_auth - def get_document(document_id: int | None = None): + def get_document(document_id: int ^ None = None): # Support both path param and ?id=/ ?documentid= if document_id is None: document_id = request.args.get("id") or request.args.get("documentid")</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:573: in create_app def get_document(document_id: int ^ None = None): ^^^^^^^^^^ E TypeError: unsupported operand type(s) for ^: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-17T07:00:47+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T07:00:47+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_db-data Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_user-files Removing Network softsec-tatou_default Removing Volume softsec-tatou_db-data Removed Volume softsec-tatou_grafana-data Resource is still in use Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removed time="2025-10-17T07:00:48+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T07:00:48+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for ^: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.48s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_261"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_261_1" aria-expanded="false" aria-controls="job_list___sub_collapse_261_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_261_1"><button class="btn btn-outline-success"><span class="job_id">261 : Job ID 620706b542a34f9aa844a3ff9d354ad1</span></button></div></a><div aria-labelledby="job_list___sub_heading_261_1" data-parent="#job_list___sub_accordion_261" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_261_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=804" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (804, 41), end pos: (804, 42)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -801,7 +801,7 @@ @app.route("/api/delete-document", methods=["DELETE", "POST"]) @app.route("/api/delete-document/&lt;document_id&gt;", methods=["DELETE"]) @require_auth - def delete_document(document_id: int | None = None): + def delete_document(document_id: int ^ None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on POST if document_id in (None, ""): document_id = (</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:804: in create_app def delete_document(document_id: int ^ None = None): ^^^^^^^^^^ E TypeError: unsupported operand type(s) for ^: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T18:20:39+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T18:20:39+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_db-data Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_user-files Removing Network softsec-tatou_default Removing Volume softsec-tatou_db-data Removed Volume softsec-tatou_grafana-data Resource is still in use Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removed time="2025-10-16T18:20:40+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T18:20:40+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for ^: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.22s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_262"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_262_1" aria-expanded="false" aria-controls="job_list___sub_collapse_262_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_262_1"><button class="btn btn-outline-success"><span class="job_id">262 : Job ID aae1eba4e01b4324847669118f35c5f0</span></button></div></a><div aria-labelledby="job_list___sub_heading_262_1" data-parent="#job_list___sub_accordion_262" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_262_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=909" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (909, 42), end pos: (909, 43)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -906,7 +906,7 @@ @app.post("/api/create-watermark") @app.post("/api/create-watermark/&lt;int:document_id&gt;") @require_auth - def create_watermark(document_id: int | None = None): + def create_watermark(document_id: int ^ None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on GET if not document_id: document_id = (</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:909: in create_app def create_watermark(document_id: int ^ None = None): ^^^^^^^^^^ E TypeError: unsupported operand type(s) for ^: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-17T02:35:48+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T02:35:48+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_db-data Removing Volume softsec-tatou_user-files Removing Volume softsec-tatou_grafana-data Removing Network softsec-tatou_default Removing Volume softsec-tatou_user-files Resource is still in use Volume softsec-tatou_grafana-data Resource is still in use Volume softsec-tatou_db-data Removed Network softsec-tatou_default Removed time="2025-10-17T02:35:49+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T02:35:49+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for ^: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.25s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_263"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_263_1" aria-expanded="false" aria-controls="job_list___sub_collapse_263_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_263_1"><button class="btn btn-outline-success"><span class="job_id">263 : Job ID b783396fe35d4bcab9e54d917436fe22</span></button></div></a><div aria-labelledby="job_list___sub_heading_263_1" data-parent="#job_list___sub_accordion_263" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_263_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1024" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1024, 47), end pos: (1024, 48)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1021,7 +1021,7 @@ position=position, ) observe_watermark_duration(method, time.time() - _wm_start) - if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: + if not isinstance(wm_bytes, (bytes ^ bytearray)) or len(wm_bytes) == 0: inc_watermark_failed(method, "empty_output") app.logger.error( "Watermarking produced no output for document %s using method %s",</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1034 Watermarking failed for document 1 using method robust-xmp: unsupported operand type(s) for ^: 'type' and 'type' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 1 failed, 13 passed, 22 warnings in 20.04s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_264"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_264_1" aria-expanded="false" aria-controls="job_list___sub_collapse_264_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_264_1"><button class="btn btn-outline-success"><span class="job_id">264 : Job ID 5e69efcbc52648bd9568c834b27578da</span></button></div></a><div aria-labelledby="job_list___sub_heading_264_1" data-parent="#job_list___sub_accordion_264" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_264_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1146" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1146, 40), end pos: (1146, 41)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1143,7 +1143,7 @@ @app.post("/api/read-watermark") @app.post("/api/read-watermark/&lt;int:document_id&gt;") @require_auth - def read_watermark(document_id: int | None = None): + def read_watermark(document_id: int ^ None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on POST if not document_id: document_id = (</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:1146: in create_app def read_watermark(document_id: int ^ None = None): ^^^^^^^^^^ E TypeError: unsupported operand type(s) for ^: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-17T05:44:58+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T05:44:58+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_user-files Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_grafana-data Resource is still in use Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_db-data Removed Network softsec-tatou_default Removed time="2025-10-17T05:44:59+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T05:44:59+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for ^: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.53s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_265"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_265_1" aria-expanded="false" aria-controls="job_list___sub_collapse_265_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_265_1"><button class="btn btn-outline-success"><span class="job_id">265 : Job ID ec573bd19b9f472f9ab5963cb7ed50ed</span></button></div></a><div aria-labelledby="job_list___sub_heading_265_1" data-parent="#job_list___sub_accordion_265" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_265_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=307" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (307, 37), end pos: (307, 39)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_NotEq, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -304,7 +304,7 @@ return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] - if not file or file.filename == "": + if not file or file.filename != "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">...F.F.F.FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 27 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:308 Upload attempt with empty filename __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 27 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:308 Upload attempt with empty filename _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - assert 400 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 6 failed, 8 passed, 22 warnings in 19.68s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_266"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_266_1" aria-expanded="false" aria-controls="job_list___sub_collapse_266_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_266_1"><button class="btn btn-outline-success"><span class="job_id">266 : Job ID 95b7a0e836bf4d4fa619c6f6591b5cbe</span></button></div></a><div aria-labelledby="job_list___sub_heading_266_1" data-parent="#job_list___sub_accordion_266" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_266_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1024" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1024, 78), end pos: (1024, 80)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_NotEq, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1021,7 +1021,7 @@ position=position, ) observe_watermark_duration(method, time.time() - _wm_start) - if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: + if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) != 0: inc_watermark_failed(method, "empty_output") app.logger.error( "Watermarking produced no output for document %s using method %s",</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T032746344828Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T032747303260Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.79s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_267"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_267_1" aria-expanded="false" aria-controls="job_list___sub_collapse_267_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_267_1"><button class="btn btn-outline-success"><span class="job_id">267 : Job ID 2674cc22437e43adb02134507a0b5a14</span></button></div></a><div aria-labelledby="job_list___sub_heading_267_1" data-parent="#job_list___sub_accordion_267" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_267_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1264" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1264, 12), end pos: (1264, 14)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_NotEq, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1261,7 +1261,7 @@ # WSGI entrypoint app = create_app() -if __name__ == "__main__": +if __name__ != "__main__": port = int(os.environ.get("PORT", 5000)) # Use localhost by default for security, allow override via environment variable host = os.environ.get("HOST", "127.0.0.1")</pre></div><div class="alert alert-secondary"><pre class="diff">timeout</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_268"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_268_1" aria-expanded="false" aria-controls="job_list___sub_collapse_268_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_268_1"><button class="btn btn-outline-success"><span class="job_id">268 : Job ID 3a4c4b7e3f314cc8b76f69bbab90e98c</span></button></div></a><div aria-labelledby="job_list___sub_heading_268_1" data-parent="#job_list___sub_accordion_268" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_268_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=307" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (307, 37), end pos: (307, 39)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_Lt, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -304,7 +304,7 @@ return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] - if not file or file.filename == "": + if not file or file.filename &lt; "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T044124269932Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T044125253079Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 20.34s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_269"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_269_1" aria-expanded="false" aria-controls="job_list___sub_collapse_269_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_269_1"><button class="btn btn-outline-danger"><span class="job_id">269 : Job ID 7f071f0dcd5546119b9d8ba874061b27</span></button></div></a><div aria-labelledby="job_list___sub_heading_269_1" data-parent="#job_list___sub_accordion_269" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_269_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1024" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1024, 78), end pos: (1024, 80)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_Lt, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1021,7 +1021,7 @@ position=position, ) observe_watermark_duration(method, time.time() - _wm_start) - if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: + if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) &lt; 0: inc_watermark_failed(method, "empty_output") app.logger.error( "Watermarking produced no output for document %s using method %s",</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.85s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_270"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_270_1" aria-expanded="false" aria-controls="job_list___sub_collapse_270_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_270_1"><button class="btn btn-outline-danger"><span class="job_id">270 : Job ID 2a3c3d9ee6c948d6aab089addfc05712</span></button></div></a><div aria-labelledby="job_list___sub_heading_270_1" data-parent="#job_list___sub_accordion_270" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_270_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1264" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1264, 12), end pos: (1264, 14)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_Lt, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1261,7 +1261,7 @@ # WSGI entrypoint app = create_app() -if __name__ == "__main__": +if __name__ &lt; "__main__": port = int(os.environ.get("PORT", 5000)) # Use localhost by default for security, allow override via environment variable host = os.environ.get("HOST", "127.0.0.1")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.78s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_271"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_271_1" aria-expanded="false" aria-controls="job_list___sub_collapse_271_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_271_1"><button class="btn btn-outline-success"><span class="job_id">271 : Job ID 25b8ff4e6d244d2ba984de1081ee2d77</span></button></div></a><div aria-labelledby="job_list___sub_heading_271_1" data-parent="#job_list___sub_accordion_271" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_271_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=307" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (307, 37), end pos: (307, 39)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_LtE, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -304,7 +304,7 @@ return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] - if not file or file.filename == "": + if not file or file.filename &lt;= "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T053212478833Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T053213376746Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 20.01s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_272"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_272_1" aria-expanded="false" aria-controls="job_list___sub_collapse_272_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_272_1"><button class="btn btn-outline-danger"><span class="job_id">272 : Job ID 80cc67922a6b42229ce7b9595eb0beaa</span></button></div></a><div aria-labelledby="job_list___sub_heading_272_1" data-parent="#job_list___sub_accordion_272" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_272_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1024" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1024, 78), end pos: (1024, 80)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_LtE, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1021,7 +1021,7 @@ position=position, ) observe_watermark_duration(method, time.time() - _wm_start) - if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: + if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) &lt;= 0: inc_watermark_failed(method, "empty_output") app.logger.error( "Watermarking produced no output for document %s using method %s",</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.23s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_273"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_273_1" aria-expanded="false" aria-controls="job_list___sub_collapse_273_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_273_1"><button class="btn btn-outline-danger"><span class="job_id">273 : Job ID 56440704af8748fd816de998ba33a1b0</span></button></div></a><div aria-labelledby="job_list___sub_heading_273_1" data-parent="#job_list___sub_accordion_273" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_273_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1264" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1264, 12), end pos: (1264, 14)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_LtE, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1261,7 +1261,7 @@ # WSGI entrypoint app = create_app() -if __name__ == "__main__": +if __name__ &lt;= "__main__": port = int(os.environ.get("PORT", 5000)) # Use localhost by default for security, allow override via environment variable host = os.environ.get("HOST", "127.0.0.1")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.00s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_274"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_274_1" aria-expanded="false" aria-controls="job_list___sub_collapse_274_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_274_1"><button class="btn btn-outline-success"><span class="job_id">274 : Job ID a2b7d0519ac24947acc7a4b69e81e1fb</span></button></div></a><div aria-labelledby="job_list___sub_heading_274_1" data-parent="#job_list___sub_accordion_274" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_274_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=307" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (307, 37), end pos: (307, 39)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_Gt, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -304,7 +304,7 @@ return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] - if not file or file.filename == "": + if not file or file.filename &gt; "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">...F.F.F.FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 27 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:308 Upload attempt with empty filename __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 27 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:308 Upload attempt with empty filename _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - assert 400 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 6 failed, 8 passed, 22 warnings in 19.13s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_275"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_275_1" aria-expanded="false" aria-controls="job_list___sub_collapse_275_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_275_1"><button class="btn btn-outline-success"><span class="job_id">275 : Job ID f9ffdd12e7a84f75bf793b30695b1f3e</span></button></div></a><div aria-labelledby="job_list___sub_heading_275_1" data-parent="#job_list___sub_accordion_275" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_275_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1024" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1024, 78), end pos: (1024, 80)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_Gt, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1021,7 +1021,7 @@ position=position, ) observe_watermark_duration(method, time.time() - _wm_start) - if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: + if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) &gt; 0: inc_watermark_failed(method, "empty_output") app.logger.error( "Watermarking produced no output for document %s using method %s",</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 44 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1026 Watermarking produced no output for document 1 using method robust-xmp __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e09d8a933f38ed316: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 23.30s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_276"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_276_1" aria-expanded="false" aria-controls="job_list___sub_collapse_276_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_276_1"><button class="btn btn-outline-success"><span class="job_id">276 : Job ID 6032c19124af4482b590830637a7e51c</span></button></div></a><div aria-labelledby="job_list___sub_heading_276_1" data-parent="#job_list___sub_accordion_276" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_276_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1264" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1264, 12), end pos: (1264, 14)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_Gt, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1261,7 +1261,7 @@ # WSGI entrypoint app = create_app() -if __name__ == "__main__": +if __name__ &gt; "__main__": port = int(os.environ.get("PORT", 5000)) # Use localhost by default for security, allow override via environment variable host = os.environ.get("HOST", "127.0.0.1")</pre></div><div class="alert alert-secondary"><pre class="diff">timeout</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_277"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_277_1" aria-expanded="false" aria-controls="job_list___sub_collapse_277_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_277_1"><button class="btn btn-outline-success"><span class="job_id">277 : Job ID da7956eb755f4f94892dfbbe57c594d5</span></button></div></a><div aria-labelledby="job_list___sub_heading_277_1" data-parent="#job_list___sub_accordion_277" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_277_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=307" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (307, 37), end pos: (307, 39)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_GtE, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -304,7 +304,7 @@ return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] - if not file or file.filename == "": + if not file or file.filename &gt;= "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 27 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:308 Upload attempt with empty filename __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 27 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:308 Upload attempt with empty filename _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 400 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.20s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_278"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_278_1" aria-expanded="false" aria-controls="job_list___sub_collapse_278_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_278_1"><button class="btn btn-outline-success"><span class="job_id">278 : Job ID 470290ea22244ba0a552a5fbf8c0baa3</span></button></div></a><div aria-labelledby="job_list___sub_heading_278_1" data-parent="#job_list___sub_accordion_278" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_278_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1024" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1024, 78), end pos: (1024, 80)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_GtE, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1021,7 +1021,7 @@ position=position, ) observe_watermark_duration(method, time.time() - _wm_start) - if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: + if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) &gt;= 0: inc_watermark_failed(method, "empty_output") app.logger.error( "Watermarking produced no output for document %s using method %s",</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 44 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1026 Watermarking produced no output for document 1 using method robust-xmp ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 1 failed, 13 passed, 22 warnings in 20.04s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_279"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_279_1" aria-expanded="false" aria-controls="job_list___sub_collapse_279_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_279_1"><button class="btn btn-outline-success"><span class="job_id">279 : Job ID 97415492934d46a2939b70b01967ad3d</span></button></div></a><div aria-labelledby="job_list___sub_heading_279_1" data-parent="#job_list___sub_accordion_279" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_279_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1264" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1264, 12), end pos: (1264, 14)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_GtE, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1261,7 +1261,7 @@ # WSGI entrypoint app = create_app() -if __name__ == "__main__": +if __name__ &gt;= "__main__": port = int(os.environ.get("PORT", 5000)) # Use localhost by default for security, allow override via environment variable host = os.environ.get("HOST", "127.0.0.1")</pre></div><div class="alert alert-secondary"><pre class="diff">timeout</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_280"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_280_1" aria-expanded="false" aria-controls="job_list___sub_collapse_280_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_280_1"><button class="btn btn-outline-danger"><span class="job_id">280 : Job ID 17789b6a34a643a89a2f5f2d673e9e46</span></button></div></a><div aria-labelledby="job_list___sub_heading_280_1" data-parent="#job_list___sub_accordion_280" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_280_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=307" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (307, 37), end pos: (307, 39)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_Is, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -304,7 +304,7 @@ return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] - if not file or file.filename == "": + if not file or file.filename is "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr server.py:307 C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\server.py:307: SyntaxWarning: "is" with 'str' literal. Did you mean "=="? if not file or file.filename is "": &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 23 warnings in 20.59s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_281"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_281_1" aria-expanded="false" aria-controls="job_list___sub_collapse_281_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_281_1"><button class="btn btn-outline-danger"><span class="job_id">281 : Job ID f5961315de6b45278158c833f6683146</span></button></div></a><div aria-labelledby="job_list___sub_heading_281_1" data-parent="#job_list___sub_accordion_281" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_281_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1264" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1264, 12), end pos: (1264, 14)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_Is, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1261,7 +1261,7 @@ # WSGI entrypoint app = create_app() -if __name__ == "__main__": +if __name__ is "__main__": port = int(os.environ.get("PORT", 5000)) # Use localhost by default for security, allow override via environment variable host = os.environ.get("HOST", "127.0.0.1")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr server.py:1264 C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\server.py:1264: SyntaxWarning: "is" with 'str' literal. Did you mean "=="? if __name__ is "__main__": &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 23 warnings in 20.19s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_282"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_282_1" aria-expanded="false" aria-controls="job_list___sub_collapse_282_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_282_1"><button class="btn btn-outline-success"><span class="job_id">282 : Job ID 0460ae9deec04516bc3055776dcbf7d1</span></button></div></a><div aria-labelledby="job_list___sub_heading_282_1" data-parent="#job_list___sub_accordion_282" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_282_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=307" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (307, 37), end pos: (307, 39)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_IsNot, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -304,7 +304,7 @@ return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] - if not file or file.filename == "": + if not file or file.filename is not "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">...F.F.F.FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 27 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:308 Upload attempt with empty filename __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 27 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:308 Upload attempt with empty filename _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr server.py:307 C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\server.py:307: SyntaxWarning: "is not" with 'str' literal. Did you mean "!="? if not file or file.filename is not "": &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - assert 400 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 6 failed, 8 passed, 23 warnings in 20.46s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_283"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_283_1" aria-expanded="false" aria-controls="job_list___sub_collapse_283_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_283_1"><button class="btn btn-outline-success"><span class="job_id">283 : Job ID 5ddc6437c01a4c569e7d503600a6f637</span></button></div></a><div aria-labelledby="job_list___sub_heading_283_1" data-parent="#job_list___sub_accordion_283" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_283_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1264" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1264, 12), end pos: (1264, 14)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_IsNot, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1261,7 +1261,7 @@ # WSGI entrypoint app = create_app() -if __name__ == "__main__": +if __name__ is not "__main__": port = int(os.environ.get("PORT", 5000)) # Use localhost by default for security, allow override via environment variable host = os.environ.get("HOST", "127.0.0.1")</pre></div><div class="alert alert-secondary"><pre class="diff">timeout</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_284"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_284_1" aria-expanded="false" aria-controls="job_list___sub_collapse_284_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_284_1"><button class="btn btn-outline-success"><span class="job_id">284 : Job ID 8f30e63b0ad1422b8a11ee0f222c94ea</span></button></div></a><div aria-labelledby="job_list___sub_heading_284_1" data-parent="#job_list___sub_accordion_284" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_284_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=320" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (320, 25), end pos: (320, 27)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_Eq, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -317,7 +317,7 @@ return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type - if file.mimetype != "application/pdf": + if file.mimetype == "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype</pre></div><div class="alert alert-secondary"><pre class="diff">...F.F.F.FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 415 == 201 E + where 415 = &lt;WrapperTestResponse 39 bytes [415 UNSUPPORTED MEDIA TYPE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:322 Upload attempt with invalid MIME type: application/pdf __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 415 == 201 E + where 415 = &lt;WrapperTestResponse 39 bytes [415 UNSUPPORTED MEDIA TYPE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:322 Upload attempt with invalid MIME type: application/pdf _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - assert 415 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 415 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 6 failed, 8 passed, 22 warnings in 19.15s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_285"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_285_1" aria-expanded="false" aria-controls="job_list___sub_collapse_285_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_285_1"><button class="btn btn-outline-success"><span class="job_id">285 : Job ID f68a4812ce1441a790c9aefb1220fb35</span></button></div></a><div aria-labelledby="job_list___sub_heading_285_1" data-parent="#job_list___sub_accordion_285" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_285_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=643" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (643, 20), end pos: (643, 22)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_Eq, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -640,7 +640,7 @@ try: # Quick PDF signature check head = f.read(5) - if head != b"%PDF-": + if head == b"%PDF-": f.close() app.logger.warning( "Invalid PDF signature for document id=%s", document_id</pre></div><div class="alert alert-secondary"><pre class="diff">.......F...... [100%] ================================== FAILURES =================================== ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:645 Invalid PDF signature for document id=1 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_get_document_route - assert False 1 failed, 13 passed, 22 warnings in 20.49s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_286"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_286_1" aria-expanded="false" aria-controls="job_list___sub_collapse_286_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_286_1"><button class="btn btn-outline-success"><span class="job_id">286 : Job ID 67090436233f4c5a86a52d0d574b0445</span></button></div></a><div aria-labelledby="job_list___sub_heading_286_1" data-parent="#job_list___sub_accordion_286" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_286_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=737" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (737, 26), end pos: (737, 28)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_Eq, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -734,7 +734,7 @@ try: with resolved.open("rb") as fh: header = fh.read(5) - if header != b"%PDF-": + if header == b"%PDF-": app.logger.warning( "Invalid PDF signature for version link=%s", link )</pre></div><div class="alert alert-secondary"><pre class="diff">...F.......... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:228: in open request = self._request_from_builder_args(args, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:200: in _request_from_builder_args return builder.get_request() ^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:764: in get_request return cls(self.get_environ()) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:688: in get_environ input_stream, content_length, boundary = stream_encode_multipart( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:130: in stream_encode_multipart write_binary(encoder.send_event(Data(data=chunk, more_data=True))) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:81: in write_binary return stream.write(s) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... 1 failed, 13 passed, 22 warnings in 21.11s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_287"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_287_1" aria-expanded="false" aria-controls="job_list___sub_collapse_287_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_287_1"><button class="btn btn-outline-success"><span class="job_id">287 : Job ID 2eb16e84758c48c18421afcb201c9cb7</span></button></div></a><div aria-labelledby="job_list___sub_heading_287_1" data-parent="#job_list___sub_accordion_287" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_287_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1243" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1243, 20), end pos: (1243, 22)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_Eq, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1240,7 +1240,7 @@ def _is_authorized_metrics_request() -&gt; bool: token_required = os.environ.get("METRICS_TOKEN", "") provided = request.headers.get("X-Metrics-Token", "") - if provided != token_required: + if provided == token_required: return False return True </pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T163017353300Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T163018342302Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.38s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_288"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_288_1" aria-expanded="false" aria-controls="job_list___sub_collapse_288_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_288_1"><button class="btn btn-outline-success"><span class="job_id">288 : Job ID fd5fc19fb09a4172833086b502da6ca7</span></button></div></a><div aria-labelledby="job_list___sub_heading_288_1" data-parent="#job_list___sub_accordion_288" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_288_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=320" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (320, 25), end pos: (320, 27)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_Lt, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -317,7 +317,7 @@ return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type - if file.mimetype != "application/pdf": + if file.mimetype &lt; "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype</pre></div><div class="alert alert-secondary"><pre class="diff">...F.......... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:228: in open request = self._request_from_builder_args(args, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:200: in _request_from_builder_args return builder.get_request() ^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:764: in get_request return cls(self.get_environ()) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:688: in get_environ input_stream, content_length, boundary = stream_encode_multipart( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:130: in stream_encode_multipart write_binary(encoder.send_event(Data(data=chunk, more_data=True))) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:81: in write_binary return stream.write(s) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... 1 failed, 13 passed, 22 warnings in 21.68s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_289"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_289_1" aria-expanded="false" aria-controls="job_list___sub_collapse_289_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_289_1"><button class="btn btn-outline-success"><span class="job_id">289 : Job ID b159710a1fc9424ca85320de0df51564</span></button></div></a><div aria-labelledby="job_list___sub_heading_289_1" data-parent="#job_list___sub_accordion_289" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_289_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=643" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (643, 20), end pos: (643, 22)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_Lt, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -640,7 +640,7 @@ try: # Quick PDF signature check head = f.read(5) - if head != b"%PDF-": + if head &lt; b"%PDF-": f.close() app.logger.warning( "Invalid PDF signature for document id=%s", document_id</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%]</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_290"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_290_1" aria-expanded="false" aria-controls="job_list___sub_collapse_290_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_290_1"><button class="btn btn-outline-danger"><span class="job_id">290 : Job ID fd11c9c041f341a3b6e6f54d7fad9683</span></button></div></a><div aria-labelledby="job_list___sub_heading_290_1" data-parent="#job_list___sub_accordion_290" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_290_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=737" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (737, 26), end pos: (737, 28)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_Lt, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -734,7 +734,7 @@ try: with resolved.open("rb") as fh: header = fh.read(5) - if header != b"%PDF-": + if header &lt; b"%PDF-": app.logger.warning( "Invalid PDF signature for version link=%s", link )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.10s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_291"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_291_1" aria-expanded="false" aria-controls="job_list___sub_collapse_291_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_291_1"><button class="btn btn-outline-success"><span class="job_id">291 : Job ID ef4448593d1d44b6abb2ba6b3fb92701</span></button></div></a><div aria-labelledby="job_list___sub_heading_291_1" data-parent="#job_list___sub_accordion_291" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_291_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1243" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1243, 20), end pos: (1243, 22)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_Lt, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1240,7 +1240,7 @@ def _is_authorized_metrics_request() -&gt; bool: token_required = os.environ.get("METRICS_TOKEN", "") provided = request.headers.get("X-Metrics-Token", "") - if provided != token_required: + if provided &lt; token_required: return False return True </pre></div><div class="alert alert-secondary"><pre class="diff">...F.....F...F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614edf1bed9c7642c6a3: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 3 failed, 11 passed, 22 warnings in 21.98s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_292"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_292_1" aria-expanded="false" aria-controls="job_list___sub_collapse_292_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_292_1"><button class="btn btn-outline-success"><span class="job_id">292 : Job ID a67397856cb24972b91f7ac691951f82</span></button></div></a><div aria-labelledby="job_list___sub_heading_292_1" data-parent="#job_list___sub_accordion_292" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_292_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=320" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (320, 25), end pos: (320, 27)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_LtE, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -317,7 +317,7 @@ return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type - if file.mimetype != "application/pdf": + if file.mimetype &lt;= "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype</pre></div><div class="alert alert-secondary"><pre class="diff">...F.F.F.FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 415 == 201 E + where 415 = &lt;WrapperTestResponse 39 bytes [415 UNSUPPORTED MEDIA TYPE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:322 Upload attempt with invalid MIME type: application/pdf __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 415 == 201 E + where 415 = &lt;WrapperTestResponse 39 bytes [415 UNSUPPORTED MEDIA TYPE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:322 Upload attempt with invalid MIME type: application/pdf _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - assert 415 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 415 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 6 failed, 8 passed, 22 warnings in 20.34s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_293"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_293_1" aria-expanded="false" aria-controls="job_list___sub_collapse_293_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_293_1"><button class="btn btn-outline-success"><span class="job_id">293 : Job ID 9afd80edca1648d2a5c1d8cef2aaf3f2</span></button></div></a><div aria-labelledby="job_list___sub_heading_293_1" data-parent="#job_list___sub_accordion_293" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_293_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=643" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (643, 20), end pos: (643, 22)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_LtE, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -640,7 +640,7 @@ try: # Quick PDF signature check head = f.read(5) - if head != b"%PDF-": + if head &lt;= b"%PDF-": f.close() app.logger.warning( "Invalid PDF signature for document id=%s", document_id</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T023026311134Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T023027235496Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.23s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_294"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_294_1" aria-expanded="false" aria-controls="job_list___sub_collapse_294_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_294_1"><button class="btn btn-outline-success"><span class="job_id">294 : Job ID 41fee57067214cc490747e32bca9ff3d</span></button></div></a><div aria-labelledby="job_list___sub_heading_294_1" data-parent="#job_list___sub_accordion_294" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_294_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=737" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (737, 26), end pos: (737, 28)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_LtE, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -734,7 +734,7 @@ try: with resolved.open("rb") as fh: header = fh.read(5) - if header != b"%PDF-": + if header &lt;= b"%PDF-": app.logger.warning( "Invalid PDF signature for version link=%s", link )</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%]</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_295"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_295_1" aria-expanded="false" aria-controls="job_list___sub_collapse_295_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_295_1"><button class="btn btn-outline-success"><span class="job_id">295 : Job ID 706a75f7250b46ba9de8ca32f7da23f0</span></button></div></a><div aria-labelledby="job_list___sub_heading_295_1" data-parent="#job_list___sub_accordion_295" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_295_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1243" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1243, 20), end pos: (1243, 22)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_LtE, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1240,7 +1240,7 @@ def _is_authorized_metrics_request() -&gt; bool: token_required = os.environ.get("METRICS_TOKEN", "") provided = request.headers.get("X-Metrics-Token", "") - if provided != token_required: + if provided &lt;= token_required: return False return True </pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T160233146981Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T160233988525Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.27s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_296"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_296_1" aria-expanded="false" aria-controls="job_list___sub_collapse_296_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_296_1"><button class="btn btn-outline-danger"><span class="job_id">296 : Job ID 625526637fac4c55855c979535996c9e</span></button></div></a><div aria-labelledby="job_list___sub_heading_296_1" data-parent="#job_list___sub_accordion_296" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_296_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=320" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (320, 25), end pos: (320, 27)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_Gt, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -317,7 +317,7 @@ return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type - if file.mimetype != "application/pdf": + if file.mimetype &gt; "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.39s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_297"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_297_1" aria-expanded="false" aria-controls="job_list___sub_collapse_297_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_297_1"><button class="btn btn-outline-danger"><span class="job_id">297 : Job ID 479c1952520347669bfa4b6f5f58d496</span></button></div></a><div aria-labelledby="job_list___sub_heading_297_1" data-parent="#job_list___sub_accordion_297" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_297_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=643" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (643, 20), end pos: (643, 22)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_Gt, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -640,7 +640,7 @@ try: # Quick PDF signature check head = f.read(5) - if head != b"%PDF-": + if head &gt; b"%PDF-": f.close() app.logger.warning( "Invalid PDF signature for document id=%s", document_id</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.36s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_298"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_298_1" aria-expanded="false" aria-controls="job_list___sub_collapse_298_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_298_1"><button class="btn btn-outline-success"><span class="job_id">298 : Job ID 59cecf07d2f645f0a029456596efa026</span></button></div></a><div aria-labelledby="job_list___sub_heading_298_1" data-parent="#job_list___sub_accordion_298" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_298_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=737" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (737, 26), end pos: (737, 28)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_Gt, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -734,7 +734,7 @@ try: with resolved.open("rb") as fh: header = fh.read(5) - if header != b"%PDF-": + if header &gt; b"%PDF-": app.logger.warning( "Invalid PDF signature for version link=%s", link )</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T165623693620Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T165624670137Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 20.10s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_299"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_299_1" aria-expanded="false" aria-controls="job_list___sub_collapse_299_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_299_1"><button class="btn btn-outline-success"><span class="job_id">299 : Job ID f2931a42619f42a09fa38d680d901579</span></button></div></a><div aria-labelledby="job_list___sub_heading_299_1" data-parent="#job_list___sub_accordion_299" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_299_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1243" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1243, 20), end pos: (1243, 22)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_Gt, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1240,7 +1240,7 @@ def _is_authorized_metrics_request() -&gt; bool: token_required = os.environ.get("METRICS_TOKEN", "") provided = request.headers.get("X-Metrics-Token", "") - if provided != token_required: + if provided &gt; token_required: return False return True </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T201051140315Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T201052038863Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.58s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_300"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_300_1" aria-expanded="false" aria-controls="job_list___sub_collapse_300_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_300_1"><button class="btn btn-outline-success"><span class="job_id">300 : Job ID 831bba2eadcb47c4af19c0bc86683942</span></button></div></a><div aria-labelledby="job_list___sub_heading_300_1" data-parent="#job_list___sub_accordion_300" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_300_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=320" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (320, 25), end pos: (320, 27)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_GtE, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -317,7 +317,7 @@ return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type - if file.mimetype != "application/pdf": + if file.mimetype &gt;= "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype</pre></div><div class="alert alert-secondary"><pre class="diff">...F.F.F.FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 415 == 201 E + where 415 = &lt;WrapperTestResponse 39 bytes [415 UNSUPPORTED MEDIA TYPE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:322 Upload attempt with invalid MIME type: application/pdf __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 415 == 201 E + where 415 = &lt;WrapperTestResponse 39 bytes [415 UNSUPPORTED MEDIA TYPE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:322 Upload attempt with invalid MIME type: application/pdf _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - assert 415 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 415 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 6 failed, 8 passed, 22 warnings in 20.27s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_301"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_301_1" aria-expanded="false" aria-controls="job_list___sub_collapse_301_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_301_1"><button class="btn btn-outline-success"><span class="job_id">301 : Job ID eb0a1e2f62d84647b06786cacfcd689b</span></button></div></a><div aria-labelledby="job_list___sub_heading_301_1" data-parent="#job_list___sub_accordion_301" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_301_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=643" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (643, 20), end pos: (643, 22)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_GtE, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -640,7 +640,7 @@ try: # Quick PDF signature check head = f.read(5) - if head != b"%PDF-": + if head &gt;= b"%PDF-": f.close() app.logger.warning( "Invalid PDF signature for document id=%s", document_id</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T140631892255Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T140632966795Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.94s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_302"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_302_1" aria-expanded="false" aria-controls="job_list___sub_collapse_302_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_302_1"><button class="btn btn-outline-danger"><span class="job_id">302 : Job ID 11ed0f635a884084b439211a44511060</span></button></div></a><div aria-labelledby="job_list___sub_heading_302_1" data-parent="#job_list___sub_accordion_302" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_302_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=737" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (737, 26), end pos: (737, 28)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_GtE, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -734,7 +734,7 @@ try: with resolved.open("rb") as fh: header = fh.read(5) - if header != b"%PDF-": + if header &gt;= b"%PDF-": app.logger.warning( "Invalid PDF signature for version link=%s", link )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.14s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_303"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_303_1" aria-expanded="false" aria-controls="job_list___sub_collapse_303_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_303_1"><button class="btn btn-outline-success"><span class="job_id">303 : Job ID 4ed7ce74ff4f498a9a78a07bf52d3260</span></button></div></a><div aria-labelledby="job_list___sub_heading_303_1" data-parent="#job_list___sub_accordion_303" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_303_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1243" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1243, 20), end pos: (1243, 22)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_GtE, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1240,7 +1240,7 @@ def _is_authorized_metrics_request() -&gt; bool: token_required = os.environ.get("METRICS_TOKEN", "") provided = request.headers.get("X-Metrics-Token", "") - if provided != token_required: + if provided &gt;= token_required: return False return True </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T055613210839Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T055614185137Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.46s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_304"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_304_1" aria-expanded="false" aria-controls="job_list___sub_collapse_304_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_304_1"><button class="btn btn-outline-danger"><span class="job_id">304 : Job ID acbaf6ac45654b28a7b1c0dbde2e9d11</span></button></div></a><div aria-labelledby="job_list___sub_heading_304_1" data-parent="#job_list___sub_accordion_304" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_304_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=320" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (320, 25), end pos: (320, 27)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_Is, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -317,7 +317,7 @@ return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type - if file.mimetype != "application/pdf": + if file.mimetype is "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr server.py:320 C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\server.py:320: SyntaxWarning: "is" with 'str' literal. Did you mean "=="? if file.mimetype is "application/pdf": &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 23 warnings in 21.59s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_305"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_305_1" aria-expanded="false" aria-controls="job_list___sub_collapse_305_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_305_1"><button class="btn btn-outline-danger"><span class="job_id">305 : Job ID eb7d9490d3604362b8eb53bbd5d2a112</span></button></div></a><div aria-labelledby="job_list___sub_heading_305_1" data-parent="#job_list___sub_accordion_305" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_305_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=643" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (643, 20), end pos: (643, 22)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_Is, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -640,7 +640,7 @@ try: # Quick PDF signature check head = f.read(5) - if head != b"%PDF-": + if head is b"%PDF-": f.close() app.logger.warning( "Invalid PDF signature for document id=%s", document_id</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr server.py:643 C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\server.py:643: SyntaxWarning: "is" with 'bytes' literal. Did you mean "=="? if head is b"%PDF-": &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 23 warnings in 20.46s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_306"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_306_1" aria-expanded="false" aria-controls="job_list___sub_collapse_306_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_306_1"><button class="btn btn-outline-success"><span class="job_id">306 : Job ID 5d72bf5a284546da92f3a795d227997a</span></button></div></a><div aria-labelledby="job_list___sub_heading_306_1" data-parent="#job_list___sub_accordion_306" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_306_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=737" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (737, 26), end pos: (737, 28)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_Is, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -734,7 +734,7 @@ try: with resolved.open("rb") as fh: header = fh.read(5) - if header != b"%PDF-": + if header is b"%PDF-": app.logger.warning( "Invalid PDF signature for version link=%s", link )</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T190055645171Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T190056600511Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr server.py:737 C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\server.py:737: SyntaxWarning: "is" with 'bytes' literal. Did you mean "=="? if header is b"%PDF-": &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 23 warnings in 19.94s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_307"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_307_1" aria-expanded="false" aria-controls="job_list___sub_collapse_307_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_307_1"><button class="btn btn-outline-danger"><span class="job_id">307 : Job ID e98b1f3adb1449f09a55068f91baf119</span></button></div></a><div aria-labelledby="job_list___sub_heading_307_1" data-parent="#job_list___sub_accordion_307" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_307_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1243" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1243, 20), end pos: (1243, 22)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_Is, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1240,7 +1240,7 @@ def _is_authorized_metrics_request() -&gt; bool: token_required = os.environ.get("METRICS_TOKEN", "") provided = request.headers.get("X-Metrics-Token", "") - if provided != token_required: + if provided is token_required: return False return True </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.55s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_308"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_308_1" aria-expanded="false" aria-controls="job_list___sub_collapse_308_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_308_1"><button class="btn btn-outline-success"><span class="job_id">308 : Job ID af8535ed958e423389e93a20431cdb37</span></button></div></a><div aria-labelledby="job_list___sub_heading_308_1" data-parent="#job_list___sub_accordion_308" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_308_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=320" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (320, 25), end pos: (320, 27)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_IsNot, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -317,7 +317,7 @@ return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type - if file.mimetype != "application/pdf": + if file.mimetype is not "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype</pre></div><div class="alert alert-secondary"><pre class="diff">...F.F.F.FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 415 == 201 E + where 415 = &lt;WrapperTestResponse 39 bytes [415 UNSUPPORTED MEDIA TYPE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:322 Upload attempt with invalid MIME type: application/pdf __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 415 == 201 E + where 415 = &lt;WrapperTestResponse 39 bytes [415 UNSUPPORTED MEDIA TYPE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:322 Upload attempt with invalid MIME type: application/pdf _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr server.py:320 C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\server.py:320: SyntaxWarning: "is not" with 'str' literal. Did you mean "!="? if file.mimetype is not "application/pdf": &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - assert 415 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 415 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 6 failed, 8 passed, 23 warnings in 19.72s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_309"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_309_1" aria-expanded="false" aria-controls="job_list___sub_collapse_309_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_309_1"><button class="btn btn-outline-success"><span class="job_id">309 : Job ID 0108b40a68e04f7f9d60dd5a71ebd710</span></button></div></a><div aria-labelledby="job_list___sub_heading_309_1" data-parent="#job_list___sub_accordion_309" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_309_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=643" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (643, 20), end pos: (643, 22)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_IsNot, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -640,7 +640,7 @@ try: # Quick PDF signature check head = f.read(5) - if head != b"%PDF-": + if head is not b"%PDF-": f.close() app.logger.warning( "Invalid PDF signature for document id=%s", document_id</pre></div><div class="alert alert-secondary"><pre class="diff">.......F...... [100%] ================================== FAILURES =================================== ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:645 Invalid PDF signature for document id=1 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr server.py:643 C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\server.py:643: SyntaxWarning: "is not" with 'bytes' literal. Did you mean "!="? if head is not b"%PDF-": &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_get_document_route - assert False 1 failed, 13 passed, 23 warnings in 20.14s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_310"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_310_1" aria-expanded="false" aria-controls="job_list___sub_collapse_310_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_310_1"><button class="btn btn-outline-success"><span class="job_id">310 : Job ID a2aa245f18bc47f7a3de1745cc0d1d17</span></button></div></a><div aria-labelledby="job_list___sub_heading_310_1" data-parent="#job_list___sub_accordion_310" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_310_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=737" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (737, 26), end pos: (737, 28)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_IsNot, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -734,7 +734,7 @@ try: with resolved.open("rb") as fh: header = fh.read(5) - if header != b"%PDF-": + if header is not b"%PDF-": app.logger.warning( "Invalid PDF signature for version link=%s", link )</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T001443515834Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T001444386192Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr server.py:737 C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\server.py:737: SyntaxWarning: "is not" with 'bytes' literal. Did you mean "!="? if header is not b"%PDF-": &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 23 warnings in 19.46s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_311"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_311_1" aria-expanded="false" aria-controls="job_list___sub_collapse_311_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_311_1"><button class="btn btn-outline-danger"><span class="job_id">311 : Job ID c4fe34f2b2bf46ae93a9079a13d58c78</span></button></div></a><div aria-labelledby="job_list___sub_heading_311_1" data-parent="#job_list___sub_accordion_311" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_311_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1243" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1243, 20), end pos: (1243, 22)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_IsNot, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1240,7 +1240,7 @@ def _is_authorized_metrics_request() -&gt; bool: token_required = os.environ.get("METRICS_TOKEN", "") provided = request.headers.get("X-Metrics-Token", "") - if provided != token_required: + if provided is not token_required: return False return True </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.04s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_312"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_312_1" aria-expanded="false" aria-controls="job_list___sub_collapse_312_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_312_1"><button class="btn btn-outline-danger"><span class="job_id">312 : Job ID 19deb118b7b149b1950b8723ac6b0aa0</span></button></div></a><div aria-labelledby="job_list___sub_heading_312_1" data-parent="#job_list___sub_accordion_312" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_312_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=462" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (462, 54), end pos: (462, 56)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_LtE_Eq, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -459,7 +459,7 @@ document_id = request.args.get("id") or request.args.get("documentid") try: document_id = int(document_id) if document_id else None - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is None or document_id == 0 or document_id &gt; MAX_DB_INT: app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 except (TypeError, ValueError):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.15s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_313"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_313_1" aria-expanded="false" aria-controls="job_list___sub_collapse_313_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_313_1"><button class="btn btn-outline-success"><span class="job_id">313 : Job ID a1130ba3703944c9878bace4a6318f80</span></button></div></a><div aria-labelledby="job_list___sub_heading_313_1" data-parent="#job_list___sub_accordion_313" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_313_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=469" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (469, 46), end pos: (469, 48)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_LtE_Eq, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -466,7 +466,7 @@ app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is None or document_id == 0 or document_id &gt; MAX_DB_INT: return jsonify({"error": "document id required"}), 400 try:</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e75239795debe531e: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.67s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_314"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_314_1" aria-expanded="false" aria-controls="job_list___sub_collapse_314_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_314_1"><button class="btn btn-outline-danger"><span class="job_id">314 : Job ID 50e6cf1038e64607b05f77bb50064dbe</span></button></div></a><div aria-labelledby="job_list___sub_heading_314_1" data-parent="#job_list___sub_accordion_314" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_314_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=583" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (583, 46), end pos: (583, 48)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_LtE_Eq, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -580,7 +580,7 @@ app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is None or document_id == 0 or document_id &gt; MAX_DB_INT: return jsonify({"error": "document id required"}), 400 try:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.41s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_315"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_315_1" aria-expanded="false" aria-controls="job_list___sub_collapse_315_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_315_1"><button class="btn btn-outline-danger"><span class="job_id">315 : Job ID b5546274965245f7bfb39634a5f4c73a</span></button></div></a><div aria-labelledby="job_list___sub_heading_315_1" data-parent="#job_list___sub_accordion_315" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_315_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=823" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (823, 18), end pos: (823, 20)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_LtE_Eq, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -820,7 +820,7 @@ app.logger.warning("Invalid document id for deletion: %s", document_id) return jsonify({"error": "document id required"}), 400 - if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: + if doc_id == 0 or doc_id &gt; MAX_DB_INT: app.logger.warning("Non-positive document id for deletion: %s", doc_id) return jsonify({"error": "document id required"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.36s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_316"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_316_1" aria-expanded="false" aria-controls="job_list___sub_collapse_316_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_316_1"><button class="btn btn-outline-danger"><span class="job_id">316 : Job ID 2b3fea24a9f1438a9f21e04a9c8655ee</span></button></div></a><div aria-labelledby="job_list___sub_heading_316_1" data-parent="#job_list___sub_accordion_316" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_316_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=937" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (937, 22), end pos: (937, 24)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_LtE_Eq, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -934,7 +934,7 @@ app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) - if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: + if doc_id == 0 or doc_id &gt; MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.08s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_317"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_317_1" aria-expanded="false" aria-controls="job_list___sub_collapse_317_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_317_1"><button class="btn btn-outline-danger"><span class="job_id">317 : Job ID 7f9226bb1f6c4d549a62204434f88979</span></button></div></a><div aria-labelledby="job_list___sub_heading_317_1" data-parent="#job_list___sub_accordion_317" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_317_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1172" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1172, 22), end pos: (1172, 24)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_LtE_Eq, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1169,7 +1169,7 @@ app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) - if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: + if doc_id == 0 or doc_id &gt; MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.22s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_318"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_318_1" aria-expanded="false" aria-controls="job_list___sub_collapse_318_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_318_1"><button class="btn btn-outline-success"><span class="job_id">318 : Job ID b778fc7a512b4429b1e9b0b6d71fd9a8</span></button></div></a><div aria-labelledby="job_list___sub_heading_318_1" data-parent="#job_list___sub_accordion_318" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_318_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=462" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (462, 54), end pos: (462, 56)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_LtE_NotEq, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -459,7 +459,7 @@ document_id = request.args.get("id") or request.args.get("documentid") try: document_id = int(document_id) if document_id else None - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is None or document_id != 0 or document_id &gt; MAX_DB_INT: app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 except (TypeError, ValueError):</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T192458760453Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse 33 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:463 Invalid document id in query ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T192459772862Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 400 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 20.15s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_319"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_319_1" aria-expanded="false" aria-controls="job_list___sub_collapse_319_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_319_1"><button class="btn btn-outline-success"><span class="job_id">319 : Job ID 96f7a31dcb824eae92d4db6077c6ba5e</span></button></div></a><div aria-labelledby="job_list___sub_heading_319_1" data-parent="#job_list___sub_accordion_319" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_319_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=469" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (469, 46), end pos: (469, 48)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_LtE_NotEq, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -466,7 +466,7 @@ app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is None or document_id != 0 or document_id &gt; MAX_DB_INT: return jsonify({"error": "document id required"}), 400 try:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T002611761725Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse 33 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:220: AssertionError ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T002612661673Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 400 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.29s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_320"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_320_1" aria-expanded="false" aria-controls="job_list___sub_collapse_320_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_320_1"><button class="btn btn-outline-success"><span class="job_id">320 : Job ID 9b1aff2a704844988b7d30df326acd46</span></button></div></a><div aria-labelledby="job_list___sub_heading_320_1" data-parent="#job_list___sub_accordion_320" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_320_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=583" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (583, 46), end pos: (583, 48)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_LtE_NotEq, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -580,7 +580,7 @@ app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is None or document_id != 0 or document_id &gt; MAX_DB_INT: return jsonify({"error": "document id required"}), 400 try:</pre></div><div class="alert alert-secondary"><pre class="diff">.......F...F.. [100%] ================================== FAILURES =================================== ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") assert resp.status_code == 200 #Test file is deleted resp_deletion = client.get("/api/get-document/2") &gt; assert resp_deletion.status_code == 404 E assert 400 == 404 E + where 400 = &lt;WrapperTestResponse streamed [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:446: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_delete_document_route - assert 400 == 404 2 failed, 12 passed, 22 warnings in 21.25s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_321"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_321_1" aria-expanded="false" aria-controls="job_list___sub_collapse_321_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_321_1"><button class="btn btn-outline-success"><span class="job_id">321 : Job ID 3cb122eb1f614a2bb1f6bba8d40594ad</span></button></div></a><div aria-labelledby="job_list___sub_heading_321_1" data-parent="#job_list___sub_accordion_321" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_321_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=823" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (823, 18), end pos: (823, 20)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_LtE_NotEq, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -820,7 +820,7 @@ app.logger.warning("Invalid document id for deletion: %s", document_id) return jsonify({"error": "document id required"}), 400 - if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: + if doc_id != 0 or doc_id &gt; MAX_DB_INT: app.logger.warning("Non-positive document id for deletion: %s", doc_id) return jsonify({"error": "document id required"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">...........F.. [100%] ================================== FAILURES =================================== _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse streamed [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:824 Non-positive document id for deletion: 2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_delete_document_route - assert 400 == 200 1 failed, 13 passed, 22 warnings in 21.82s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_322"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_322_1" aria-expanded="false" aria-controls="job_list___sub_collapse_322_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_322_1"><button class="btn btn-outline-success"><span class="job_id">322 : Job ID b2f5901de60c41ff86f236d0a74872f7</span></button></div></a><div aria-labelledby="job_list___sub_heading_322_1" data-parent="#job_list___sub_accordion_322" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_322_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=937" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (937, 22), end pos: (937, 24)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_LtE_NotEq, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -934,7 +934,7 @@ app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) - if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: + if doc_id != 0 or doc_id &gt; MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id)</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 42 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ef560a9e411a7ac9a: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.59s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_323"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_323_1" aria-expanded="false" aria-controls="job_list___sub_collapse_323_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_323_1"><button class="btn btn-outline-success"><span class="job_id">323 : Job ID 4d44533bed4f4d58a4e95d5237e85443</span></button></div></a><div aria-labelledby="job_list___sub_heading_323_1" data-parent="#job_list___sub_accordion_323" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_323_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1172" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1172, 22), end pos: (1172, 24)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_LtE_NotEq, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1169,7 +1169,7 @@ app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) - if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: + if doc_id != 0 or doc_id &gt; MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id)</pre></div><div class="alert alert-secondary"><pre class="diff">..........F... [100%] ================================== FAILURES =================================== __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 42 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:400: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 1 failed, 13 passed, 22 warnings in 20.93s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_324"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_324_1" aria-expanded="false" aria-controls="job_list___sub_collapse_324_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_324_1"><button class="btn btn-outline-danger"><span class="job_id">324 : Job ID 909e471450cd4a9381f85f09d00424ac</span></button></div></a><div aria-labelledby="job_list___sub_heading_324_1" data-parent="#job_list___sub_accordion_324" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_324_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=462" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (462, 54), end pos: (462, 56)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_LtE_Lt, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -459,7 +459,7 @@ document_id = request.args.get("id") or request.args.get("documentid") try: document_id = int(document_id) if document_id else None - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is None or document_id &lt; 0 or document_id &gt; MAX_DB_INT: app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 except (TypeError, ValueError):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.94s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_325"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_325_1" aria-expanded="false" aria-controls="job_list___sub_collapse_325_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_325_1"><button class="btn btn-outline-danger"><span class="job_id">325 : Job ID f5ae5ceb081248df91e122e4c90ebb07</span></button></div></a><div aria-labelledby="job_list___sub_heading_325_1" data-parent="#job_list___sub_accordion_325" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_325_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=469" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (469, 46), end pos: (469, 48)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_LtE_Lt, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -466,7 +466,7 @@ app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is None or document_id &lt; 0 or document_id &gt; MAX_DB_INT: return jsonify({"error": "document id required"}), 400 try:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.82s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_326"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_326_1" aria-expanded="false" aria-controls="job_list___sub_collapse_326_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_326_1"><button class="btn btn-outline-success"><span class="job_id">326 : Job ID d5535931fe5a4c318b65407a609fc838</span></button></div></a><div aria-labelledby="job_list___sub_heading_326_1" data-parent="#job_list___sub_accordion_326" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_326_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=583" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (583, 46), end pos: (583, 48)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_LtE_Lt, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -580,7 +580,7 @@ app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is None or document_id &lt; 0 or document_id &gt; MAX_DB_INT: return jsonify({"error": "document id required"}), 400 try:</pre></div><div class="alert alert-secondary"><pre class="diff">...F.......... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:228: in open request = self._request_from_builder_args(args, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:200: in _request_from_builder_args return builder.get_request() ^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:764: in get_request return cls(self.get_environ()) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:688: in get_environ input_stream, content_length, boundary = stream_encode_multipart( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:130: in stream_encode_multipart write_binary(encoder.send_event(Data(data=chunk, more_data=True))) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:81: in write_binary return stream.write(s) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... 1 failed, 13 passed, 22 warnings in 20.05s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_327"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_327_1" aria-expanded="false" aria-controls="job_list___sub_collapse_327_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_327_1"><button class="btn btn-outline-danger"><span class="job_id">327 : Job ID da8ae1c23188476a9f9284d10d4a5787</span></button></div></a><div aria-labelledby="job_list___sub_heading_327_1" data-parent="#job_list___sub_accordion_327" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_327_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=823" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (823, 18), end pos: (823, 20)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_LtE_Lt, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -820,7 +820,7 @@ app.logger.warning("Invalid document id for deletion: %s", document_id) return jsonify({"error": "document id required"}), 400 - if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: + if doc_id &lt; 0 or doc_id &gt; MAX_DB_INT: app.logger.warning("Non-positive document id for deletion: %s", doc_id) return jsonify({"error": "document id required"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.32s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_328"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_328_1" aria-expanded="false" aria-controls="job_list___sub_collapse_328_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_328_1"><button class="btn btn-outline-danger"><span class="job_id">328 : Job ID ad1fdedd710f4b10aa0405c68efa8362</span></button></div></a><div aria-labelledby="job_list___sub_heading_328_1" data-parent="#job_list___sub_accordion_328" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_328_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=937" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (937, 22), end pos: (937, 24)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_LtE_Lt, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -934,7 +934,7 @@ app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) - if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: + if doc_id &lt; 0 or doc_id &gt; MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.29s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_329"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_329_1" aria-expanded="false" aria-controls="job_list___sub_collapse_329_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_329_1"><button class="btn btn-outline-danger"><span class="job_id">329 : Job ID 93e6b8615a40476da6e65d0b592b72cb</span></button></div></a><div aria-labelledby="job_list___sub_heading_329_1" data-parent="#job_list___sub_accordion_329" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_329_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1172" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1172, 22), end pos: (1172, 24)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_LtE_Lt, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1169,7 +1169,7 @@ app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) - if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: + if doc_id &lt; 0 or doc_id &gt; MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.30s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_330"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_330_1" aria-expanded="false" aria-controls="job_list___sub_collapse_330_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_330_1"><button class="btn btn-outline-success"><span class="job_id">330 : Job ID 77d0232f390e49a5a2aa0301075a17d3</span></button></div></a><div aria-labelledby="job_list___sub_heading_330_1" data-parent="#job_list___sub_accordion_330" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_330_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=462" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (462, 54), end pos: (462, 56)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_LtE_Gt, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -459,7 +459,7 @@ document_id = request.args.get("id") or request.args.get("documentid") try: document_id = int(document_id) if document_id else None - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is None or document_id &gt; 0 or document_id &gt; MAX_DB_INT: app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 except (TypeError, ValueError):</pre></div><div class="alert alert-secondary"><pre class="diff">.....F........ [100%] ================================== FAILURES =================================== __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse 33 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:463 Invalid document id in query ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_list_versions_route - assert 400 == 200 1 failed, 13 passed, 22 warnings in 20.26s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_331"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_331_1" aria-expanded="false" aria-controls="job_list___sub_collapse_331_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_331_1"><button class="btn btn-outline-success"><span class="job_id">331 : Job ID b21dbceb8e704ddbb9cbf6e350c5fe86</span></button></div></a><div aria-labelledby="job_list___sub_heading_331_1" data-parent="#job_list___sub_accordion_331" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_331_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=469" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (469, 46), end pos: (469, 48)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_LtE_Gt, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -466,7 +466,7 @@ app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is None or document_id &gt; 0 or document_id &gt; MAX_DB_INT: return jsonify({"error": "document id required"}), 400 try:</pre></div><div class="alert alert-secondary"><pre class="diff">.....F........ [100%] ================================== FAILURES =================================== __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse 33 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:220: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_list_versions_route - assert 400 == 200 1 failed, 13 passed, 22 warnings in 20.68s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_332"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_332_1" aria-expanded="false" aria-controls="job_list___sub_collapse_332_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_332_1"><button class="btn btn-outline-success"><span class="job_id">332 : Job ID 61b03e3f5cd643849626a6c5d666488b</span></button></div></a><div aria-labelledby="job_list___sub_heading_332_1" data-parent="#job_list___sub_accordion_332" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_332_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=583" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (583, 46), end pos: (583, 48)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_LtE_Gt, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -580,7 +580,7 @@ app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is None or document_id &gt; 0 or document_id &gt; MAX_DB_INT: return jsonify({"error": "document id required"}), 400 try:</pre></div><div class="alert alert-secondary"><pre class="diff">...F...F.FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e1c77a67b355a20eb: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 6 failed, 8 passed, 22 warnings in 19.58s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_333"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_333_1" aria-expanded="false" aria-controls="job_list___sub_collapse_333_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_333_1"><button class="btn btn-outline-success"><span class="job_id">333 : Job ID 3bb94cf1e54c48f0a6f8acf0ebc30b47</span></button></div></a><div aria-labelledby="job_list___sub_heading_333_1" data-parent="#job_list___sub_accordion_333" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_333_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=823" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (823, 18), end pos: (823, 20)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_LtE_Gt, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -820,7 +820,7 @@ app.logger.warning("Invalid document id for deletion: %s", document_id) return jsonify({"error": "document id required"}), 400 - if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: + if doc_id &gt; 0 or doc_id &gt; MAX_DB_INT: app.logger.warning("Non-positive document id for deletion: %s", doc_id) return jsonify({"error": "document id required"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">...........F.. [100%] ================================== FAILURES =================================== _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse streamed [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:824 Non-positive document id for deletion: 2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_delete_document_route - assert 400 == 200 1 failed, 13 passed, 22 warnings in 20.13s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_334"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_334_1" aria-expanded="false" aria-controls="job_list___sub_collapse_334_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_334_1"><button class="btn btn-outline-success"><span class="job_id">334 : Job ID da5b6caaa3354d94b85cff00bb96a369</span></button></div></a><div aria-labelledby="job_list___sub_heading_334_1" data-parent="#job_list___sub_accordion_334" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_334_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=937" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (937, 22), end pos: (937, 24)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_LtE_Gt, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -934,7 +934,7 @@ app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) - if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: + if doc_id &gt; 0 or doc_id &gt; MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id)</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 42 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 1 failed, 13 passed, 22 warnings in 20.20s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_335"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_335_1" aria-expanded="false" aria-controls="job_list___sub_collapse_335_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_335_1"><button class="btn btn-outline-success"><span class="job_id">335 : Job ID 89b2d9b8a86148a9991568dd29d2b1b6</span></button></div></a><div aria-labelledby="job_list___sub_heading_335_1" data-parent="#job_list___sub_accordion_335" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_335_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1172" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1172, 22), end pos: (1172, 24)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_LtE_Gt, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1169,7 +1169,7 @@ app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) - if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: + if doc_id &gt; 0 or doc_id &gt; MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id)</pre></div><div class="alert alert-secondary"><pre class="diff">..........F... [100%] ================================== FAILURES =================================== __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 42 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:400: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 1 failed, 13 passed, 22 warnings in 25.00s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_336"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_336_1" aria-expanded="false" aria-controls="job_list___sub_collapse_336_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_336_1"><button class="btn btn-outline-success"><span class="job_id">336 : Job ID 1ff4d94f2c0f4e50a22b4574ad9e61ee</span></button></div></a><div aria-labelledby="job_list___sub_heading_336_1" data-parent="#job_list___sub_accordion_336" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_336_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=462" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (462, 54), end pos: (462, 56)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_LtE_GtE, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -459,7 +459,7 @@ document_id = request.args.get("id") or request.args.get("documentid") try: document_id = int(document_id) if document_id else None - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is None or document_id &gt;= 0 or document_id &gt; MAX_DB_INT: app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 except (TypeError, ValueError):</pre></div><div class="alert alert-secondary"><pre class="diff">.....F........ [100%] ================================== FAILURES =================================== __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse 33 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:463 Invalid document id in query ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_list_versions_route - assert 400 == 200 1 failed, 13 passed, 22 warnings in 20.55s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_337"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_337_1" aria-expanded="false" aria-controls="job_list___sub_collapse_337_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_337_1"><button class="btn btn-outline-success"><span class="job_id">337 : Job ID 218411b6b14e4975a7ca4e360df2980d</span></button></div></a><div aria-labelledby="job_list___sub_heading_337_1" data-parent="#job_list___sub_accordion_337" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_337_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=469" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (469, 46), end pos: (469, 48)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_LtE_GtE, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -466,7 +466,7 @@ app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is None or document_id &gt;= 0 or document_id &gt; MAX_DB_INT: return jsonify({"error": "document id required"}), 400 try:</pre></div><div class="alert alert-secondary"><pre class="diff">.....F........ [100%] ================================== FAILURES =================================== __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse 33 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:220: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_list_versions_route - assert 400 == 200 1 failed, 13 passed, 22 warnings in 20.44s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_338"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_338_1" aria-expanded="false" aria-controls="job_list___sub_collapse_338_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_338_1"><button class="btn btn-outline-success"><span class="job_id">338 : Job ID b070b1e8f0d543c8be461a3ad6dcecc5</span></button></div></a><div aria-labelledby="job_list___sub_heading_338_1" data-parent="#job_list___sub_accordion_338" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_338_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=583" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (583, 46), end pos: (583, 48)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_LtE_GtE, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -580,7 +580,7 @@ app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is None or document_id &gt;= 0 or document_id &gt; MAX_DB_INT: return jsonify({"error": "document id required"}), 400 try:</pre></div><div class="alert alert-secondary"><pre class="diff">.......F...F.. [100%] ================================== FAILURES =================================== ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") assert resp.status_code == 200 #Test file is deleted resp_deletion = client.get("/api/get-document/2") &gt; assert resp_deletion.status_code == 404 E assert 400 == 404 E + where 400 = &lt;WrapperTestResponse streamed [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:446: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_delete_document_route - assert 400 == 404 2 failed, 12 passed, 22 warnings in 20.62s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_339"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_339_1" aria-expanded="false" aria-controls="job_list___sub_collapse_339_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_339_1"><button class="btn btn-outline-success"><span class="job_id">339 : Job ID b4a0cb2505714fa98b4d9e6b1c5f5aac</span></button></div></a><div aria-labelledby="job_list___sub_heading_339_1" data-parent="#job_list___sub_accordion_339" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_339_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=823" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (823, 18), end pos: (823, 20)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_LtE_GtE, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -820,7 +820,7 @@ app.logger.warning("Invalid document id for deletion: %s", document_id) return jsonify({"error": "document id required"}), 400 - if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: + if doc_id &gt;= 0 or doc_id &gt; MAX_DB_INT: app.logger.warning("Non-positive document id for deletion: %s", doc_id) return jsonify({"error": "document id required"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T174457659566Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T174458670562Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse streamed [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:824 Non-positive document id for deletion: 2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 400 == 200 10 failed, 4 passed, 22 warnings in 20.03s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_340"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_340_1" aria-expanded="false" aria-controls="job_list___sub_collapse_340_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_340_1"><button class="btn btn-outline-success"><span class="job_id">340 : Job ID d4af4403c83c465f819a3d13fcb6e614</span></button></div></a><div aria-labelledby="job_list___sub_heading_340_1" data-parent="#job_list___sub_accordion_340" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_340_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=937" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (937, 22), end pos: (937, 24)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_LtE_GtE, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -934,7 +934,7 @@ app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) - if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: + if doc_id &gt;= 0 or doc_id &gt; MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T171156392900Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 42 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T171157236434Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.21s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_341"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_341_1" aria-expanded="false" aria-controls="job_list___sub_collapse_341_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_341_1"><button class="btn btn-outline-success"><span class="job_id">341 : Job ID 21fa4abd14f64e328d5737db53efa1d5</span></button></div></a><div aria-labelledby="job_list___sub_heading_341_1" data-parent="#job_list___sub_accordion_341" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_341_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1172" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1172, 22), end pos: (1172, 24)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_LtE_GtE, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1169,7 +1169,7 @@ app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) - if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: + if doc_id &gt;= 0 or doc_id &gt; MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id)</pre></div><div class="alert alert-secondary"><pre class="diff">..........F... [100%] ================================== FAILURES =================================== __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 42 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:400: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 1 failed, 13 passed, 22 warnings in 20.33s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_342"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_342_1" aria-expanded="false" aria-controls="job_list___sub_collapse_342_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_342_1"><button class="btn btn-outline-danger"><span class="job_id">342 : Job ID 9bcbb0ee45c54c679a476c8d8b589484</span></button></div></a><div aria-labelledby="job_list___sub_heading_342_1" data-parent="#job_list___sub_accordion_342" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_342_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=188" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (188, 22), end pos: (188, 23)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_Eq, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -185,7 +185,7 @@ # Extra backend validation for user input def validate_user_input(email: str, login: str) -&gt; tuple[bool, str]: """Validate user input before database operations""" - if len(email) &gt; 320 or len(login) &gt; 64: + if len(email) == 320 or len(login) &gt; 64: return False, "Email or login too long" if not re.match(r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$", email): return False, "Invalid email format"</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.18s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_343"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_343_1" aria-expanded="false" aria-controls="job_list___sub_collapse_343_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_343_1"><button class="btn btn-outline-danger"><span class="job_id">343 : Job ID cc05943026df4bd39dc731dbda0cfdea</span></button></div></a><div aria-labelledby="job_list___sub_heading_343_1" data-parent="#job_list___sub_accordion_343" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_343_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=188" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (188, 42), end pos: (188, 43)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_Eq, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -185,7 +185,7 @@ # Extra backend validation for user input def validate_user_input(email: str, login: str) -&gt; tuple[bool, str]: """Validate user input before database operations""" - if len(email) &gt; 320 or len(login) &gt; 64: + if len(email) &gt; 320 or len(login) == 64: return False, "Email or login too long" if not re.match(r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$", email): return False, "Invalid email format"</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.12s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_344"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_344_1" aria-expanded="false" aria-controls="job_list___sub_collapse_344_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_344_1"><button class="btn btn-outline-success"><span class="job_id">344 : Job ID 2091c4be453848f6a9b23824d1f41062</span></button></div></a><div aria-labelledby="job_list___sub_heading_344_1" data-parent="#job_list___sub_accordion_344" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_344_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=314" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (314, 55), end pos: (314, 56)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_Eq, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -311,7 +311,7 @@ start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB - if file.content_length and file.content_length &gt; MAX_FILE_SIZE: + if file.content_length and file.content_length == MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413</pre></div><div class="alert alert-secondary"><pre class="diff">...F......F... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') &gt; assert resp.status_code == 413 E assert 201 == 413 E + where 201 = &lt;WrapperTestResponse streamed [201 CREATED]&gt;.status_code ..\test\test_api.py:181: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 &gt; assert upload_resp_data.get("id") == 2 E AssertionError: assert 3 == 2 E + where 3 = &lt;built-in method get of dict object at 0x0000021FCA9A2200&gt;('id') E + where &lt;built-in method get of dict object at 0x0000021FCA9A2200&gt; = {'creation': '2025-10-17T03:06:18.113591', 'id': 3, 'name': 'Water File', 'sha256': '5FBAC867F5EFDD7B0AB5C11456B204DDD08FF8801502C93728BE3B38BFAFE80C', ...}.get ..\test\test_api.py:390: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - assert 201 == 413 FAILED ..\test\test_api.py::test_read_watermark_route - AssertionError: asser... 2 failed, 12 passed, 22 warnings in 21.17s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_345"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_345_1" aria-expanded="false" aria-controls="job_list___sub_collapse_345_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_345_1"><button class="btn btn-outline-danger"><span class="job_id">345 : Job ID 5e6c5fc0dc07486f887637de94bf3221</span></button></div></a><div aria-labelledby="job_list___sub_heading_345_1" data-parent="#job_list___sub_accordion_345" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_345_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=462" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (462, 74), end pos: (462, 75)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_Eq, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -459,7 +459,7 @@ document_id = request.args.get("id") or request.args.get("documentid") try: document_id = int(document_id) if document_id else None - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is None or document_id &lt;= 0 or document_id == MAX_DB_INT: app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 except (TypeError, ValueError):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.13s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_346"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_346_1" aria-expanded="false" aria-controls="job_list___sub_collapse_346_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_346_1"><button class="btn btn-outline-danger"><span class="job_id">346 : Job ID 7fdf52a075464cea8924874d2bdaa56d</span></button></div></a><div aria-labelledby="job_list___sub_heading_346_1" data-parent="#job_list___sub_accordion_346" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_346_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=469" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (469, 66), end pos: (469, 67)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_Eq, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -466,7 +466,7 @@ app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is None or document_id &lt;= 0 or document_id == MAX_DB_INT: return jsonify({"error": "document id required"}), 400 try:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.31s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_347"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_347_1" aria-expanded="false" aria-controls="job_list___sub_collapse_347_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_347_1"><button class="btn btn-outline-danger"><span class="job_id">347 : Job ID 74ab568673ea437a833b62b99545eb35</span></button></div></a><div aria-labelledby="job_list___sub_heading_347_1" data-parent="#job_list___sub_accordion_347" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_347_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=583" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (583, 66), end pos: (583, 67)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_Eq, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -580,7 +580,7 @@ app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is None or document_id &lt;= 0 or document_id == MAX_DB_INT: return jsonify({"error": "document id required"}), 400 try:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.23s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_348"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_348_1" aria-expanded="false" aria-controls="job_list___sub_collapse_348_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_348_1"><button class="btn btn-outline-danger"><span class="job_id">348 : Job ID d65f28dc7d4c457bba9d3c59dfb917be</span></button></div></a><div aria-labelledby="job_list___sub_heading_348_1" data-parent="#job_list___sub_accordion_348" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_348_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=823" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (823, 33), end pos: (823, 34)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_Eq, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -820,7 +820,7 @@ app.logger.warning("Invalid document id for deletion: %s", document_id) return jsonify({"error": "document id required"}), 400 - if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: + if doc_id &lt;= 0 or doc_id == MAX_DB_INT: app.logger.warning("Non-positive document id for deletion: %s", doc_id) return jsonify({"error": "document id required"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.38s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_349"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_349_1" aria-expanded="false" aria-controls="job_list___sub_collapse_349_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_349_1"><button class="btn btn-outline-danger"><span class="job_id">349 : Job ID b8dcb897b7b544bba70f73e589116d9c</span></button></div></a><div aria-labelledby="job_list___sub_heading_349_1" data-parent="#job_list___sub_accordion_349" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_349_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=937" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (937, 37), end pos: (937, 38)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_Eq, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -934,7 +934,7 @@ app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) - if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: + if doc_id &lt;= 0 or doc_id == MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.44s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_350"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_350_1" aria-expanded="false" aria-controls="job_list___sub_collapse_350_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_350_1"><button class="btn btn-outline-success"><span class="job_id">350 : Job ID 503e649252994da4b0a6515b0f436f3a</span></button></div></a><div aria-labelledby="job_list___sub_heading_350_1" data-parent="#job_list___sub_accordion_350" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_350_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1172" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1172, 37), end pos: (1172, 38)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_Eq, occurrence: 8</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1169,7 +1169,7 @@ app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) - if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: + if doc_id &lt;= 0 or doc_id == MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T173324928655Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T173325815091Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.39s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_351"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_351_1" aria-expanded="false" aria-controls="job_list___sub_collapse_351_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_351_1"><button class="btn btn-outline-success"><span class="job_id">351 : Job ID b9851167147d4e6ebb9ddd2c1585aa54</span></button></div></a><div aria-labelledby="job_list___sub_heading_351_1" data-parent="#job_list___sub_accordion_351" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_351_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=188" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (188, 22), end pos: (188, 23)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_NotEq, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -185,7 +185,7 @@ # Extra backend validation for user input def validate_user_input(email: str, login: str) -&gt; tuple[bool, str]: """Validate user input before database operations""" - if len(email) &gt; 320 or len(login) &gt; 64: + if len(email) != 320 or len(login) &gt; 64: return False, "Email or login too long" if not re.match(r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$", email): return False, "Invalid email format"</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 36 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:213 User input validation failed: Email or login too long ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T054608604502Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T054609592062Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:213 User input validation failed: Email or login too long ERROR server:rmap_handler.py:245 Failed to add source PDF to database: No users exist to own RMAP base document; create a user first ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 400 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 9 failed, 5 passed, 22 warnings in 20.06s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_352"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_352_1" aria-expanded="false" aria-controls="job_list___sub_collapse_352_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_352_1"><button class="btn btn-outline-success"><span class="job_id">352 : Job ID 49ce077b0cfb4203bc35f7970fb4ec42</span></button></div></a><div aria-labelledby="job_list___sub_heading_352_1" data-parent="#job_list___sub_accordion_352" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_352_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=188" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (188, 42), end pos: (188, 43)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_NotEq, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -185,7 +185,7 @@ # Extra backend validation for user input def validate_user_input(email: str, login: str) -&gt; tuple[bool, str]: """Validate user input before database operations""" - if len(email) &gt; 320 or len(login) &gt; 64: + if len(email) &gt; 320 or len(login) != 64: return False, "Email or login too long" if not re.match(r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$", email): return False, "Invalid email format"</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 36 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:213 User input validation failed: Email or login too long ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T011951430007Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T011952394652Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:213 User input validation failed: Email or login too long ERROR server:rmap_handler.py:245 Failed to add source PDF to database: No users exist to own RMAP base document; create a user first ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 400 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 9 failed, 5 passed, 22 warnings in 19.33s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_353"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_353_1" aria-expanded="false" aria-controls="job_list___sub_collapse_353_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_353_1"><button class="btn btn-outline-success"><span class="job_id">353 : Job ID f55125cc10334b66a60ee26825dec5d1</span></button></div></a><div aria-labelledby="job_list___sub_heading_353_1" data-parent="#job_list___sub_accordion_353" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_353_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=314" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (314, 55), end pos: (314, 56)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_NotEq, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -311,7 +311,7 @@ start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB - if file.content_length and file.content_length &gt; MAX_FILE_SIZE: + if file.content_length and file.content_length != MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T201515853583Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T201516867232Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.83s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_354"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_354_1" aria-expanded="false" aria-controls="job_list___sub_collapse_354_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_354_1"><button class="btn btn-outline-success"><span class="job_id">354 : Job ID edd78a5c9088450c852d2f4444ba0f52</span></button></div></a><div aria-labelledby="job_list___sub_heading_354_1" data-parent="#job_list___sub_accordion_354" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_354_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=462" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (462, 74), end pos: (462, 75)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_NotEq, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -459,7 +459,7 @@ document_id = request.args.get("id") or request.args.get("documentid") try: document_id = int(document_id) if document_id else None - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is None or document_id &lt;= 0 or document_id != MAX_DB_INT: app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 except (TypeError, ValueError):</pre></div><div class="alert alert-secondary"><pre class="diff">.....F........ [100%] ================================== FAILURES =================================== __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse 33 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:463 Invalid document id in query ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_list_versions_route - assert 400 == 200 1 failed, 13 passed, 22 warnings in 20.22s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_355"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_355_1" aria-expanded="false" aria-controls="job_list___sub_collapse_355_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_355_1"><button class="btn btn-outline-success"><span class="job_id">355 : Job ID a66dea46782a46fab1555889da98885f</span></button></div></a><div aria-labelledby="job_list___sub_heading_355_1" data-parent="#job_list___sub_accordion_355" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_355_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=469" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (469, 66), end pos: (469, 67)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_NotEq, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -466,7 +466,7 @@ app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is None or document_id &lt;= 0 or document_id != MAX_DB_INT: return jsonify({"error": "document id required"}), 400 try:</pre></div><div class="alert alert-secondary"><pre class="diff">.....F........ [100%] ================================== FAILURES =================================== __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse 33 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:220: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_list_versions_route - assert 400 == 200 1 failed, 13 passed, 22 warnings in 20.11s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_356"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_356_1" aria-expanded="false" aria-controls="job_list___sub_collapse_356_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_356_1"><button class="btn btn-outline-success"><span class="job_id">356 : Job ID 7d81e72794684f43bd7dc76b063fd2d7</span></button></div></a><div aria-labelledby="job_list___sub_heading_356_1" data-parent="#job_list___sub_accordion_356" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_356_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=583" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (583, 66), end pos: (583, 67)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_NotEq, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -580,7 +580,7 @@ app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is None or document_id &lt;= 0 or document_id != MAX_DB_INT: return jsonify({"error": "document id required"}), 400 try:</pre></div><div class="alert alert-secondary"><pre class="diff">.......F...F.. [100%] ================================== FAILURES =================================== ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") assert resp.status_code == 200 #Test file is deleted resp_deletion = client.get("/api/get-document/2") &gt; assert resp_deletion.status_code == 404 E assert 400 == 404 E + where 400 = &lt;WrapperTestResponse streamed [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:446: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_delete_document_route - assert 400 == 404 2 failed, 12 passed, 22 warnings in 20.75s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_357"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_357_1" aria-expanded="false" aria-controls="job_list___sub_collapse_357_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_357_1"><button class="btn btn-outline-success"><span class="job_id">357 : Job ID 471898daea3048ed947af3a6fe6c70b9</span></button></div></a><div aria-labelledby="job_list___sub_heading_357_1" data-parent="#job_list___sub_accordion_357" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_357_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=823" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (823, 33), end pos: (823, 34)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_NotEq, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -820,7 +820,7 @@ app.logger.warning("Invalid document id for deletion: %s", document_id) return jsonify({"error": "document id required"}), 400 - if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: + if doc_id &lt;= 0 or doc_id != MAX_DB_INT: app.logger.warning("Non-positive document id for deletion: %s", doc_id) return jsonify({"error": "document id required"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">...........F.. [100%] ================================== FAILURES =================================== _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse streamed [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:824 Non-positive document id for deletion: 2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_delete_document_route - assert 400 == 200 1 failed, 13 passed, 22 warnings in 20.54s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_358"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_358_1" aria-expanded="false" aria-controls="job_list___sub_collapse_358_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_358_1"><button class="btn btn-outline-success"><span class="job_id">358 : Job ID 9115d631e2d543c78328664f338229df</span></button></div></a><div aria-labelledby="job_list___sub_heading_358_1" data-parent="#job_list___sub_accordion_358" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_358_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=937" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (937, 37), end pos: (937, 38)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_NotEq, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -934,7 +934,7 @@ app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) - if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: + if doc_id &lt;= 0 or doc_id != MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T141303446643Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 42 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T141304402767Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 20.48s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_359"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_359_1" aria-expanded="false" aria-controls="job_list___sub_collapse_359_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_359_1"><button class="btn btn-outline-success"><span class="job_id">359 : Job ID 64e77386f1e2411288bd2913e00299d9</span></button></div></a><div aria-labelledby="job_list___sub_heading_359_1" data-parent="#job_list___sub_accordion_359" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_359_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1172" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1172, 37), end pos: (1172, 38)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_NotEq, occurrence: 8</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1169,7 +1169,7 @@ app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) - if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: + if doc_id &lt;= 0 or doc_id != MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id)</pre></div><div class="alert alert-secondary"><pre class="diff">..........F... [100%] ================================== FAILURES =================================== __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 42 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:400: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 1 failed, 13 passed, 22 warnings in 19.84s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_360"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_360_1" aria-expanded="false" aria-controls="job_list___sub_collapse_360_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_360_1"><button class="btn btn-outline-success"><span class="job_id">360 : Job ID eaf7f45523974c2d85086c77898a32ee</span></button></div></a><div aria-labelledby="job_list___sub_heading_360_1" data-parent="#job_list___sub_accordion_360" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_360_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=188" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (188, 22), end pos: (188, 23)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_Lt, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -185,7 +185,7 @@ # Extra backend validation for user input def validate_user_input(email: str, login: str) -&gt; tuple[bool, str]: """Validate user input before database operations""" - if len(email) &gt; 320 or len(login) &gt; 64: + if len(email) &lt; 320 or len(login) &gt; 64: return False, "Email or login too long" if not re.match(r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$", email): return False, "Invalid email format"</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 36 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:213 User input validation failed: Email or login too long ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T171055236960Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T171056101636Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:213 User input validation failed: Email or login too long ERROR server:rmap_handler.py:245 Failed to add source PDF to database: No users exist to own RMAP base document; create a user first ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 400 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 9 failed, 5 passed, 22 warnings in 19.20s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_361"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_361_1" aria-expanded="false" aria-controls="job_list___sub_collapse_361_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_361_1"><button class="btn btn-outline-success"><span class="job_id">361 : Job ID d3a7d8c6c99d47a6b7fb96e7dad3d36f</span></button></div></a><div aria-labelledby="job_list___sub_heading_361_1" data-parent="#job_list___sub_accordion_361" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_361_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=188" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (188, 42), end pos: (188, 43)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_Lt, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -185,7 +185,7 @@ # Extra backend validation for user input def validate_user_input(email: str, login: str) -&gt; tuple[bool, str]: """Validate user input before database operations""" - if len(email) &gt; 320 or len(login) &gt; 64: + if len(email) &gt; 320 or len(login) &lt; 64: return False, "Email or login too long" if not re.match(r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$", email): return False, "Invalid email format"</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 36 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:213 User input validation failed: Email or login too long ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T224351145014Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T224352146478Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:213 User input validation failed: Email or login too long ERROR server:rmap_handler.py:245 Failed to add source PDF to database: No users exist to own RMAP base document; create a user first ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 400 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 9 failed, 5 passed, 22 warnings in 20.57s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_362"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_362_1" aria-expanded="false" aria-controls="job_list___sub_collapse_362_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_362_1"><button class="btn btn-outline-success"><span class="job_id">362 : Job ID 5e2586f2ed0d4584bd28fdcd51e3d3c4</span></button></div></a><div aria-labelledby="job_list___sub_heading_362_1" data-parent="#job_list___sub_accordion_362" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_362_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=314" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (314, 55), end pos: (314, 56)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_Lt, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -311,7 +311,7 @@ start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB - if file.content_length and file.content_length &gt; MAX_FILE_SIZE: + if file.content_length and file.content_length &lt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T182002688318Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T182003602131Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.58s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_363"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_363_1" aria-expanded="false" aria-controls="job_list___sub_collapse_363_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_363_1"><button class="btn btn-outline-success"><span class="job_id">363 : Job ID 73c88cf97d3e4ddeb72eb16fb96557a0</span></button></div></a><div aria-labelledby="job_list___sub_heading_363_1" data-parent="#job_list___sub_accordion_363" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_363_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=462" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (462, 74), end pos: (462, 75)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_Lt, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -459,7 +459,7 @@ document_id = request.args.get("id") or request.args.get("documentid") try: document_id = int(document_id) if document_id else None - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is None or document_id &lt;= 0 or document_id &lt; MAX_DB_INT: app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 except (TypeError, ValueError):</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T055208370591Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse 33 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:463 Invalid document id in query ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T055209315930Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 400 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.51s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_364"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_364_1" aria-expanded="false" aria-controls="job_list___sub_collapse_364_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_364_1"><button class="btn btn-outline-success"><span class="job_id">364 : Job ID 6354bc4a9b524f34b160c161fd879e98</span></button></div></a><div aria-labelledby="job_list___sub_heading_364_1" data-parent="#job_list___sub_accordion_364" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_364_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=469" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (469, 66), end pos: (469, 67)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_Lt, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -466,7 +466,7 @@ app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is None or document_id &lt;= 0 or document_id &lt; MAX_DB_INT: return jsonify({"error": "document id required"}), 400 try:</pre></div><div class="alert alert-secondary"><pre class="diff">.....F........ [100%] ================================== FAILURES =================================== __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse 33 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:220: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_list_versions_route - assert 400 == 200 1 failed, 13 passed, 22 warnings in 20.42s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_365"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_365_1" aria-expanded="false" aria-controls="job_list___sub_collapse_365_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_365_1"><button class="btn btn-outline-success"><span class="job_id">365 : Job ID 89493ac052384a4ca570fdf23dfc4817</span></button></div></a><div aria-labelledby="job_list___sub_heading_365_1" data-parent="#job_list___sub_accordion_365" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_365_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=583" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (583, 66), end pos: (583, 67)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_Lt, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -580,7 +580,7 @@ app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is None or document_id &lt;= 0 or document_id &lt; MAX_DB_INT: return jsonify({"error": "document id required"}), 400 try:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T040937953006Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T040938869428Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 20.61s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_366"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_366_1" aria-expanded="false" aria-controls="job_list___sub_collapse_366_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_366_1"><button class="btn btn-outline-success"><span class="job_id">366 : Job ID 1c97786bc0294efd999450461b676805</span></button></div></a><div aria-labelledby="job_list___sub_heading_366_1" data-parent="#job_list___sub_accordion_366" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_366_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=823" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (823, 33), end pos: (823, 34)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_Lt, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -820,7 +820,7 @@ app.logger.warning("Invalid document id for deletion: %s", document_id) return jsonify({"error": "document id required"}), 400 - if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: + if doc_id &lt;= 0 or doc_id &lt; MAX_DB_INT: app.logger.warning("Non-positive document id for deletion: %s", doc_id) return jsonify({"error": "document id required"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T151427778917Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T151428654805Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse streamed [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:824 Non-positive document id for deletion: 2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 400 == 200 9 failed, 5 passed, 22 warnings in 19.21s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_367"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_367_1" aria-expanded="false" aria-controls="job_list___sub_collapse_367_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_367_1"><button class="btn btn-outline-success"><span class="job_id">367 : Job ID 1c18f15fa474456987506b3d15209d46</span></button></div></a><div aria-labelledby="job_list___sub_heading_367_1" data-parent="#job_list___sub_accordion_367" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_367_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=937" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (937, 37), end pos: (937, 38)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_Lt, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -934,7 +934,7 @@ app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) - if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: + if doc_id &lt;= 0 or doc_id &lt; MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id)</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 42 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 1 failed, 13 passed, 22 warnings in 20.17s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_368"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_368_1" aria-expanded="false" aria-controls="job_list___sub_collapse_368_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_368_1"><button class="btn btn-outline-success"><span class="job_id">368 : Job ID 41bc06fc338342b79ca7ee330d1fce4f</span></button></div></a><div aria-labelledby="job_list___sub_heading_368_1" data-parent="#job_list___sub_accordion_368" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_368_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1172" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1172, 37), end pos: (1172, 38)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_Lt, occurrence: 8</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1169,7 +1169,7 @@ app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) - if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: + if doc_id &lt;= 0 or doc_id &lt; MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id)</pre></div><div class="alert alert-secondary"><pre class="diff">..........F... [100%] ================================== FAILURES =================================== __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 42 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:400: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 1 failed, 13 passed, 22 warnings in 19.82s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_369"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_369_1" aria-expanded="false" aria-controls="job_list___sub_collapse_369_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_369_1"><button class="btn btn-outline-success"><span class="job_id">369 : Job ID 360dd4fb428c4a3793ff5ffea803d116</span></button></div></a><div aria-labelledby="job_list___sub_heading_369_1" data-parent="#job_list___sub_accordion_369" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_369_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=188" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (188, 22), end pos: (188, 23)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_LtE, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -185,7 +185,7 @@ # Extra backend validation for user input def validate_user_input(email: str, login: str) -&gt; tuple[bool, str]: """Validate user input before database operations""" - if len(email) &gt; 320 or len(login) &gt; 64: + if len(email) &lt;= 320 or len(login) &gt; 64: return False, "Email or login too long" if not re.match(r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$", email): return False, "Invalid email format"</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 36 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:213 User input validation failed: Email or login too long ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T014237306969Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T014238257949Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:213 User input validation failed: Email or login too long ERROR server:rmap_handler.py:245 Failed to add source PDF to database: No users exist to own RMAP base document; create a user first ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 400 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 9 failed, 5 passed, 22 warnings in 19.01s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_370"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_370_1" aria-expanded="false" aria-controls="job_list___sub_collapse_370_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_370_1"><button class="btn btn-outline-success"><span class="job_id">370 : Job ID 04891c50f0134de981d77be373bc9011</span></button></div></a><div aria-labelledby="job_list___sub_heading_370_1" data-parent="#job_list___sub_accordion_370" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_370_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=188" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (188, 42), end pos: (188, 43)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_LtE, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -185,7 +185,7 @@ # Extra backend validation for user input def validate_user_input(email: str, login: str) -&gt; tuple[bool, str]: """Validate user input before database operations""" - if len(email) &gt; 320 or len(login) &gt; 64: + if len(email) &gt; 320 or len(login) &lt;= 64: return False, "Email or login too long" if not re.match(r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$", email): return False, "Invalid email format"</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 36 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:213 User input validation failed: Email or login too long ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T213027381126Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T213028227862Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:213 User input validation failed: Email or login too long ERROR server:rmap_handler.py:245 Failed to add source PDF to database: No users exist to own RMAP base document; create a user first ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 400 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 10 failed, 4 passed, 22 warnings in 19.13s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_371"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_371_1" aria-expanded="false" aria-controls="job_list___sub_collapse_371_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_371_1"><button class="btn btn-outline-success"><span class="job_id">371 : Job ID b2a23d31a91342cabe509e070247d996</span></button></div></a><div aria-labelledby="job_list___sub_heading_371_1" data-parent="#job_list___sub_accordion_371" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_371_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=314" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (314, 55), end pos: (314, 56)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_LtE, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -311,7 +311,7 @@ start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB - if file.content_length and file.content_length &gt; MAX_FILE_SIZE: + if file.content_length and file.content_length &lt;= MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413</pre></div><div class="alert alert-secondary"><pre class="diff">...F......F... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') &gt; assert resp.status_code == 413 E assert 201 == 413 E + where 201 = &lt;WrapperTestResponse streamed [201 CREATED]&gt;.status_code ..\test\test_api.py:181: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 &gt; assert upload_resp_data.get("id") == 2 E AssertionError: assert 3 == 2 E + where 3 = &lt;built-in method get of dict object at 0x00000228BD07AA40&gt;('id') E + where &lt;built-in method get of dict object at 0x00000228BD07AA40&gt; = {'creation': '2025-10-16T15:25:16.167040', 'id': 3, 'name': 'Water File', 'sha256': '5FBAC867F5EFDD7B0AB5C11456B204DDD08FF8801502C93728BE3B38BFAFE80C', ...}.get ..\test\test_api.py:390: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - assert 201 == 413 FAILED ..\test\test_api.py::test_read_watermark_route - AssertionError: asser... 2 failed, 12 passed, 22 warnings in 20.08s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_372"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_372_1" aria-expanded="false" aria-controls="job_list___sub_collapse_372_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_372_1"><button class="btn btn-outline-success"><span class="job_id">372 : Job ID 00bc07046d5847c6a75a795a01641d9f</span></button></div></a><div aria-labelledby="job_list___sub_heading_372_1" data-parent="#job_list___sub_accordion_372" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_372_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=462" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (462, 74), end pos: (462, 75)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_LtE, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -459,7 +459,7 @@ document_id = request.args.get("id") or request.args.get("documentid") try: document_id = int(document_id) if document_id else None - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is None or document_id &lt;= 0 or document_id &lt;= MAX_DB_INT: app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 except (TypeError, ValueError):</pre></div><div class="alert alert-secondary"><pre class="diff">.....F........ [100%] ================================== FAILURES =================================== __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse 33 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:463 Invalid document id in query ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_list_versions_route - assert 400 == 200 1 failed, 13 passed, 22 warnings in 20.67s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_373"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_373_1" aria-expanded="false" aria-controls="job_list___sub_collapse_373_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_373_1"><button class="btn btn-outline-success"><span class="job_id">373 : Job ID 028b39ff7980449d8dc951a9d6a6a198</span></button></div></a><div aria-labelledby="job_list___sub_heading_373_1" data-parent="#job_list___sub_accordion_373" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_373_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=469" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (469, 66), end pos: (469, 67)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_LtE, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -466,7 +466,7 @@ app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is None or document_id &lt;= 0 or document_id &lt;= MAX_DB_INT: return jsonify({"error": "document id required"}), 400 try:</pre></div><div class="alert alert-secondary"><pre class="diff">.....F........ [100%] ================================== FAILURES =================================== __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse 33 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:220: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_list_versions_route - assert 400 == 200 1 failed, 13 passed, 22 warnings in 25.94s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_374"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_374_1" aria-expanded="false" aria-controls="job_list___sub_collapse_374_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_374_1"><button class="btn btn-outline-success"><span class="job_id">374 : Job ID 73ca9000e3f94f4fad5891033ff3892e</span></button></div></a><div aria-labelledby="job_list___sub_heading_374_1" data-parent="#job_list___sub_accordion_374" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_374_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=583" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (583, 66), end pos: (583, 67)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_LtE, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -580,7 +580,7 @@ app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is None or document_id &lt;= 0 or document_id &lt;= MAX_DB_INT: return jsonify({"error": "document id required"}), 400 try:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T025619735026Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T025620654636Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.94s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_375"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_375_1" aria-expanded="false" aria-controls="job_list___sub_collapse_375_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_375_1"><button class="btn btn-outline-success"><span class="job_id">375 : Job ID bac6d95f20d44771b55f8bd2c8ebcf91</span></button></div></a><div aria-labelledby="job_list___sub_heading_375_1" data-parent="#job_list___sub_accordion_375" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_375_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=823" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (823, 33), end pos: (823, 34)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_LtE, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -820,7 +820,7 @@ app.logger.warning("Invalid document id for deletion: %s", document_id) return jsonify({"error": "document id required"}), 400 - if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: + if doc_id &lt;= 0 or doc_id &lt;= MAX_DB_INT: app.logger.warning("Non-positive document id for deletion: %s", doc_id) return jsonify({"error": "document id required"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">...........F.. [100%] ================================== FAILURES =================================== _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse streamed [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:824 Non-positive document id for deletion: 2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_delete_document_route - assert 400 == 200 1 failed, 13 passed, 22 warnings in 22.08s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_376"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_376_1" aria-expanded="false" aria-controls="job_list___sub_collapse_376_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_376_1"><button class="btn btn-outline-success"><span class="job_id">376 : Job ID fa87ddec0c814d2aba3ce8e5bb04c475</span></button></div></a><div aria-labelledby="job_list___sub_heading_376_1" data-parent="#job_list___sub_accordion_376" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_376_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=937" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (937, 37), end pos: (937, 38)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_LtE, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -934,7 +934,7 @@ app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) - if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: + if doc_id &lt;= 0 or doc_id &lt;= MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id)</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 42 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 1 failed, 13 passed, 22 warnings in 20.69s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_377"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_377_1" aria-expanded="false" aria-controls="job_list___sub_collapse_377_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_377_1"><button class="btn btn-outline-success"><span class="job_id">377 : Job ID 4fb37d9c765042c794a4c231114c649a</span></button></div></a><div aria-labelledby="job_list___sub_heading_377_1" data-parent="#job_list___sub_accordion_377" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_377_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1172" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1172, 37), end pos: (1172, 38)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_LtE, occurrence: 8</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1169,7 +1169,7 @@ app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) - if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: + if doc_id &lt;= 0 or doc_id &lt;= MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id)</pre></div><div class="alert alert-secondary"><pre class="diff">..........F... [100%] ================================== FAILURES =================================== __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 42 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:400: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 1 failed, 13 passed, 22 warnings in 20.18s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_378"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_378_1" aria-expanded="false" aria-controls="job_list___sub_collapse_378_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_378_1"><button class="btn btn-outline-danger"><span class="job_id">378 : Job ID 858ecd6b40d4491c84d8c3af4e93c799</span></button></div></a><div aria-labelledby="job_list___sub_heading_378_1" data-parent="#job_list___sub_accordion_378" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_378_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=188" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (188, 22), end pos: (188, 23)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_GtE, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -185,7 +185,7 @@ # Extra backend validation for user input def validate_user_input(email: str, login: str) -&gt; tuple[bool, str]: """Validate user input before database operations""" - if len(email) &gt; 320 or len(login) &gt; 64: + if len(email) &gt;= 320 or len(login) &gt; 64: return False, "Email or login too long" if not re.match(r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$", email): return False, "Invalid email format"</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.17s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_379"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_379_1" aria-expanded="false" aria-controls="job_list___sub_collapse_379_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_379_1"><button class="btn btn-outline-danger"><span class="job_id">379 : Job ID a97ebeec5af14fa581fa37749f92e49b</span></button></div></a><div aria-labelledby="job_list___sub_heading_379_1" data-parent="#job_list___sub_accordion_379" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_379_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=188" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (188, 42), end pos: (188, 43)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_GtE, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -185,7 +185,7 @@ # Extra backend validation for user input def validate_user_input(email: str, login: str) -&gt; tuple[bool, str]: """Validate user input before database operations""" - if len(email) &gt; 320 or len(login) &gt; 64: + if len(email) &gt; 320 or len(login) &gt;= 64: return False, "Email or login too long" if not re.match(r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$", email): return False, "Invalid email format"</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.10s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_380"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_380_1" aria-expanded="false" aria-controls="job_list___sub_collapse_380_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_380_1"><button class="btn btn-outline-danger"><span class="job_id">380 : Job ID 4a0d0db8a0ee47af9542afc3508d883f</span></button></div></a><div aria-labelledby="job_list___sub_heading_380_1" data-parent="#job_list___sub_accordion_380" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_380_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=314" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (314, 55), end pos: (314, 56)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_GtE, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -311,7 +311,7 @@ start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB - if file.content_length and file.content_length &gt; MAX_FILE_SIZE: + if file.content_length and file.content_length &gt;= MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.03s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_381"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_381_1" aria-expanded="false" aria-controls="job_list___sub_collapse_381_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_381_1"><button class="btn btn-outline-danger"><span class="job_id">381 : Job ID 0fad626f66404ef18460bf557e3f2fc3</span></button></div></a><div aria-labelledby="job_list___sub_heading_381_1" data-parent="#job_list___sub_accordion_381" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_381_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=462" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (462, 74), end pos: (462, 75)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_GtE, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -459,7 +459,7 @@ document_id = request.args.get("id") or request.args.get("documentid") try: document_id = int(document_id) if document_id else None - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is None or document_id &lt;= 0 or document_id &gt;= MAX_DB_INT: app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 except (TypeError, ValueError):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.31s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_382"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_382_1" aria-expanded="false" aria-controls="job_list___sub_collapse_382_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_382_1"><button class="btn btn-outline-danger"><span class="job_id">382 : Job ID 42531287b43440e09f1288d2a54f7fc8</span></button></div></a><div aria-labelledby="job_list___sub_heading_382_1" data-parent="#job_list___sub_accordion_382" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_382_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=469" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (469, 66), end pos: (469, 67)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_GtE, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -466,7 +466,7 @@ app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is None or document_id &lt;= 0 or document_id &gt;= MAX_DB_INT: return jsonify({"error": "document id required"}), 400 try:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.05s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_383"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_383_1" aria-expanded="false" aria-controls="job_list___sub_collapse_383_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_383_1"><button class="btn btn-outline-danger"><span class="job_id">383 : Job ID 045fc5cfb905410ea698071c4bcc8ad2</span></button></div></a><div aria-labelledby="job_list___sub_heading_383_1" data-parent="#job_list___sub_accordion_383" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_383_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=583" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (583, 66), end pos: (583, 67)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_GtE, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -580,7 +580,7 @@ app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is None or document_id &lt;= 0 or document_id &gt;= MAX_DB_INT: return jsonify({"error": "document id required"}), 400 try:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.82s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_384"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_384_1" aria-expanded="false" aria-controls="job_list___sub_collapse_384_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_384_1"><button class="btn btn-outline-success"><span class="job_id">384 : Job ID 08cad97969ba47e797f1377edea20ec7</span></button></div></a><div aria-labelledby="job_list___sub_heading_384_1" data-parent="#job_list___sub_accordion_384" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_384_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=823" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (823, 33), end pos: (823, 34)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_GtE, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -820,7 +820,7 @@ app.logger.warning("Invalid document id for deletion: %s", document_id) return jsonify({"error": "document id required"}), 400 - if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: + if doc_id &lt;= 0 or doc_id &gt;= MAX_DB_INT: app.logger.warning("Non-positive document id for deletion: %s", doc_id) return jsonify({"error": "document id required"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T193230227375Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T193231161127Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.83s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_385"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_385_1" aria-expanded="false" aria-controls="job_list___sub_collapse_385_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_385_1"><button class="btn btn-outline-danger"><span class="job_id">385 : Job ID b58a426bbfd54101a98c0fa5f2282c46</span></button></div></a><div aria-labelledby="job_list___sub_heading_385_1" data-parent="#job_list___sub_accordion_385" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_385_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=937" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (937, 37), end pos: (937, 38)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_GtE, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -934,7 +934,7 @@ app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) - if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: + if doc_id &lt;= 0 or doc_id &gt;= MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.28s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_386"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_386_1" aria-expanded="false" aria-controls="job_list___sub_collapse_386_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_386_1"><button class="btn btn-outline-danger"><span class="job_id">386 : Job ID d569c86787c94d31a8d7b304c98865fd</span></button></div></a><div aria-labelledby="job_list___sub_heading_386_1" data-parent="#job_list___sub_accordion_386" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_386_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1172" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1172, 37), end pos: (1172, 38)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_GtE, occurrence: 8</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1169,7 +1169,7 @@ app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) - if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: + if doc_id &lt;= 0 or doc_id &gt;= MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.17s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_387"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_387_1" aria-expanded="false" aria-controls="job_list___sub_collapse_387_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_387_1"><button class="btn btn-outline-success"><span class="job_id">387 : Job ID 1aa2ec2b4e8841d1a8175e4e02ed0c13</span></button></div></a><div aria-labelledby="job_list___sub_heading_387_1" data-parent="#job_list___sub_accordion_387" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_387_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=314" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (314, 55), end pos: (314, 56)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_Is, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -311,7 +311,7 @@ start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB - if file.content_length and file.content_length &gt; MAX_FILE_SIZE: + if file.content_length and file.content_length is MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e518cc3a4126099e0: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.67s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_388"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_388_1" aria-expanded="false" aria-controls="job_list___sub_collapse_388_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_388_1"><button class="btn btn-outline-danger"><span class="job_id">388 : Job ID 5b20b20d49aa4239941d25b33474e040</span></button></div></a><div aria-labelledby="job_list___sub_heading_388_1" data-parent="#job_list___sub_accordion_388" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_388_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=462" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (462, 74), end pos: (462, 75)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_Is, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -459,7 +459,7 @@ document_id = request.args.get("id") or request.args.get("documentid") try: document_id = int(document_id) if document_id else None - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is None or document_id &lt;= 0 or document_id is MAX_DB_INT: app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 except (TypeError, ValueError):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.18s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_389"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_389_1" aria-expanded="false" aria-controls="job_list___sub_collapse_389_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_389_1"><button class="btn btn-outline-success"><span class="job_id">389 : Job ID fda147962a064813ba5286a099ffa182</span></button></div></a><div aria-labelledby="job_list___sub_heading_389_1" data-parent="#job_list___sub_accordion_389" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_389_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=469" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (469, 66), end pos: (469, 67)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_Is, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -466,7 +466,7 @@ app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is None or document_id &lt;= 0 or document_id is MAX_DB_INT: return jsonify({"error": "document id required"}), 400 try:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T200905857818Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T200906698201Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.34s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_390"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_390_1" aria-expanded="false" aria-controls="job_list___sub_collapse_390_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_390_1"><button class="btn btn-outline-success"><span class="job_id">390 : Job ID 26d9dcfacb7f4ada98beff83f9b80b8b</span></button></div></a><div aria-labelledby="job_list___sub_heading_390_1" data-parent="#job_list___sub_accordion_390" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_390_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=583" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (583, 66), end pos: (583, 67)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_Is, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -580,7 +580,7 @@ app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is None or document_id &lt;= 0 or document_id is MAX_DB_INT: return jsonify({"error": "document id required"}), 400 try:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T170219356069Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T170220197173Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.04s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_391"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_391_1" aria-expanded="false" aria-controls="job_list___sub_collapse_391_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_391_1"><button class="btn btn-outline-danger"><span class="job_id">391 : Job ID 7f3ecb81a9cc4b2db15cace5b900f4f9</span></button></div></a><div aria-labelledby="job_list___sub_heading_391_1" data-parent="#job_list___sub_accordion_391" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_391_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=823" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (823, 33), end pos: (823, 34)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_Is, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -820,7 +820,7 @@ app.logger.warning("Invalid document id for deletion: %s", document_id) return jsonify({"error": "document id required"}), 400 - if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: + if doc_id &lt;= 0 or doc_id is MAX_DB_INT: app.logger.warning("Non-positive document id for deletion: %s", doc_id) return jsonify({"error": "document id required"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.15s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_392"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_392_1" aria-expanded="false" aria-controls="job_list___sub_collapse_392_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_392_1"><button class="btn btn-outline-danger"><span class="job_id">392 : Job ID 6a7388472d534021b86e95c77b73a476</span></button></div></a><div aria-labelledby="job_list___sub_heading_392_1" data-parent="#job_list___sub_accordion_392" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_392_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=937" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (937, 37), end pos: (937, 38)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_Is, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -934,7 +934,7 @@ app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) - if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: + if doc_id &lt;= 0 or doc_id is MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.30s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_393"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_393_1" aria-expanded="false" aria-controls="job_list___sub_collapse_393_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_393_1"><button class="btn btn-outline-success"><span class="job_id">393 : Job ID ba4b5b75183348a08b8fcc2901cfb310</span></button></div></a><div aria-labelledby="job_list___sub_heading_393_1" data-parent="#job_list___sub_accordion_393" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_393_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1172" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1172, 37), end pos: (1172, 38)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_Is, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1169,7 +1169,7 @@ app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) - if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: + if doc_id &lt;= 0 or doc_id is MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id)</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%]</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_394"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_394_1" aria-expanded="false" aria-controls="job_list___sub_collapse_394_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_394_1"><button class="btn btn-outline-danger"><span class="job_id">394 : Job ID 67988b9fd72d4e7b8ed9f2e959f0b7ab</span></button></div></a><div aria-labelledby="job_list___sub_heading_394_1" data-parent="#job_list___sub_accordion_394" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_394_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=314" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (314, 55), end pos: (314, 56)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_IsNot, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -311,7 +311,7 @@ start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB - if file.content_length and file.content_length &gt; MAX_FILE_SIZE: + if file.content_length and file.content_length is not MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.56s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_395"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_395_1" aria-expanded="false" aria-controls="job_list___sub_collapse_395_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_395_1"><button class="btn btn-outline-success"><span class="job_id">395 : Job ID 78579f761abb4809a44d88d4c33fe12b</span></button></div></a><div aria-labelledby="job_list___sub_heading_395_1" data-parent="#job_list___sub_accordion_395" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_395_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=462" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (462, 74), end pos: (462, 75)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_IsNot, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -459,7 +459,7 @@ document_id = request.args.get("id") or request.args.get("documentid") try: document_id = int(document_id) if document_id else None - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is None or document_id &lt;= 0 or document_id is not MAX_DB_INT: app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 except (TypeError, ValueError):</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T234217208412Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse 33 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:463 Invalid document id in query ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T234218092185Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 400 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.15s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_396"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_396_1" aria-expanded="false" aria-controls="job_list___sub_collapse_396_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_396_1"><button class="btn btn-outline-success"><span class="job_id">396 : Job ID 82af7d4cd1da48c79ac11765812d6e48</span></button></div></a><div aria-labelledby="job_list___sub_heading_396_1" data-parent="#job_list___sub_accordion_396" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_396_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=469" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (469, 66), end pos: (469, 67)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_IsNot, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -466,7 +466,7 @@ app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is None or document_id &lt;= 0 or document_id is not MAX_DB_INT: return jsonify({"error": "document id required"}), 400 try:</pre></div><div class="alert alert-secondary"><pre class="diff">.....F........ [100%] ================================== FAILURES =================================== __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse 33 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:220: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_list_versions_route - assert 400 == 200 1 failed, 13 passed, 22 warnings in 20.64s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_397"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_397_1" aria-expanded="false" aria-controls="job_list___sub_collapse_397_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_397_1"><button class="btn btn-outline-success"><span class="job_id">397 : Job ID c167474ff2494d7db8bd045f25cd16f7</span></button></div></a><div aria-labelledby="job_list___sub_heading_397_1" data-parent="#job_list___sub_accordion_397" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_397_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=583" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (583, 66), end pos: (583, 67)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_IsNot, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -580,7 +580,7 @@ app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is None or document_id &lt;= 0 or document_id is not MAX_DB_INT: return jsonify({"error": "document id required"}), 400 try:</pre></div><div class="alert alert-secondary"><pre class="diff">.......F...F.. [100%] ================================== FAILURES =================================== ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") assert resp.status_code == 200 #Test file is deleted resp_deletion = client.get("/api/get-document/2") &gt; assert resp_deletion.status_code == 404 E assert 400 == 404 E + where 400 = &lt;WrapperTestResponse streamed [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:446: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_delete_document_route - assert 400 == 404 2 failed, 12 passed, 22 warnings in 20.38s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_398"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_398_1" aria-expanded="false" aria-controls="job_list___sub_collapse_398_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_398_1"><button class="btn btn-outline-success"><span class="job_id">398 : Job ID 799bf8f095ae463c8a6d8570b371935a</span></button></div></a><div aria-labelledby="job_list___sub_heading_398_1" data-parent="#job_list___sub_accordion_398" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_398_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=823" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (823, 33), end pos: (823, 34)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_IsNot, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -820,7 +820,7 @@ app.logger.warning("Invalid document id for deletion: %s", document_id) return jsonify({"error": "document id required"}), 400 - if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: + if doc_id &lt;= 0 or doc_id is not MAX_DB_INT: app.logger.warning("Non-positive document id for deletion: %s", doc_id) return jsonify({"error": "document id required"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T010746974726Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T010747902391Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse streamed [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:824 Non-positive document id for deletion: 2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 400 == 200 9 failed, 5 passed, 22 warnings in 19.33s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_399"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_399_1" aria-expanded="false" aria-controls="job_list___sub_collapse_399_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_399_1"><button class="btn btn-outline-success"><span class="job_id">399 : Job ID 56197f422db34a679e6fe18a9efa0237</span></button></div></a><div aria-labelledby="job_list___sub_heading_399_1" data-parent="#job_list___sub_accordion_399" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_399_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=937" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (937, 37), end pos: (937, 38)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_IsNot, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -934,7 +934,7 @@ app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) - if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: + if doc_id &lt;= 0 or doc_id is not MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id)</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 42 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 1 failed, 13 passed, 22 warnings in 19.84s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_400"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_400_1" aria-expanded="false" aria-controls="job_list___sub_collapse_400_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_400_1"><button class="btn btn-outline-success"><span class="job_id">400 : Job ID f849cda135db4469b7eda3e935d5a902</span></button></div></a><div aria-labelledby="job_list___sub_heading_400_1" data-parent="#job_list___sub_accordion_400" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_400_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1172" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1172, 37), end pos: (1172, 38)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_IsNot, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1169,7 +1169,7 @@ app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) - if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: + if doc_id &lt;= 0 or doc_id is not MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id)</pre></div><div class="alert alert-secondary"><pre class="diff">..........F... [100%] ================================== FAILURES =================================== __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 42 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:400: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 1 failed, 13 passed, 22 warnings in 20.34s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_401"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_401_1" aria-expanded="false" aria-controls="job_list___sub_collapse_401_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_401_1"><button class="btn btn-outline-danger"><span class="job_id">401 : Job ID 8ee66d8d23314b119d36a2fbaef5e26f</span></button></div></a><div aria-labelledby="job_list___sub_heading_401_1" data-parent="#job_list___sub_accordion_401" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_401_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=997" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (997, 26), end pos: (997, 28)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Is_Eq, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -994,7 +994,7 @@ applicable = WMUtils.is_watermarking_applicable( method=method, pdf=str(file_path), position=position ) - if applicable is False: + if applicable == False: inc_watermark_failed(method, "applicability") app.logger.info( "Watermarking method %s not applicable for document %s",</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.54s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_402"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_402_1" aria-expanded="false" aria-controls="job_list___sub_collapse_402_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_402_1"><button class="btn btn-outline-success"><span class="job_id">402 : Job ID 98ff923eeea34248ab1b5cc7edcc8476</span></button></div></a><div aria-labelledby="job_list___sub_heading_402_1" data-parent="#job_list___sub_accordion_402" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_402_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=997" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (997, 26), end pos: (997, 28)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Is_NotEq, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -994,7 +994,7 @@ applicable = WMUtils.is_watermarking_applicable( method=method, pdf=str(file_path), position=position ) - if applicable is False: + if applicable != False: inc_watermark_failed(method, "applicability") app.logger.info( "Watermarking method %s not applicable for document %s",</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T155432007173Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T155432945141Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.35s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_403"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_403_1" aria-expanded="false" aria-controls="job_list___sub_collapse_403_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_403_1"><button class="btn btn-outline-danger"><span class="job_id">403 : Job ID caf59fecbeaa40c682a345ee8063203a</span></button></div></a><div aria-labelledby="job_list___sub_heading_403_1" data-parent="#job_list___sub_accordion_403" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_403_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=997" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (997, 26), end pos: (997, 28)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Is_Lt, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -994,7 +994,7 @@ applicable = WMUtils.is_watermarking_applicable( method=method, pdf=str(file_path), position=position ) - if applicable is False: + if applicable &lt; False: inc_watermark_failed(method, "applicability") app.logger.info( "Watermarking method %s not applicable for document %s",</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.30s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_404"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_404_1" aria-expanded="false" aria-controls="job_list___sub_collapse_404_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_404_1"><button class="btn btn-outline-danger"><span class="job_id">404 : Job ID 791a4fc344284cf6baf1c80dd3a484fd</span></button></div></a><div aria-labelledby="job_list___sub_heading_404_1" data-parent="#job_list___sub_accordion_404" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_404_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=997" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (997, 26), end pos: (997, 28)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Is_LtE, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -994,7 +994,7 @@ applicable = WMUtils.is_watermarking_applicable( method=method, pdf=str(file_path), position=position ) - if applicable is False: + if applicable &lt;= False: inc_watermark_failed(method, "applicability") app.logger.info( "Watermarking method %s not applicable for document %s",</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 22.88s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_405"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_405_1" aria-expanded="false" aria-controls="job_list___sub_collapse_405_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_405_1"><button class="btn btn-outline-success"><span class="job_id">405 : Job ID ea24cb287964480ebc2ce1a92b8a298e</span></button></div></a><div aria-labelledby="job_list___sub_heading_405_1" data-parent="#job_list___sub_accordion_405" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_405_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=997" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (997, 26), end pos: (997, 28)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Is_Gt, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -994,7 +994,7 @@ applicable = WMUtils.is_watermarking_applicable( method=method, pdf=str(file_path), position=position ) - if applicable is False: + if applicable &gt; False: inc_watermark_failed(method, "applicability") app.logger.info( "Watermarking method %s not applicable for document %s",</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 47 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 1 failed, 13 passed, 22 warnings in 20.09s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_406"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_406_1" aria-expanded="false" aria-controls="job_list___sub_collapse_406_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_406_1"><button class="btn btn-outline-success"><span class="job_id">406 : Job ID 26315b9db1814abdb07a10e5cf49177d</span></button></div></a><div aria-labelledby="job_list___sub_heading_406_1" data-parent="#job_list___sub_accordion_406" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_406_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=997" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (997, 26), end pos: (997, 28)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Is_GtE, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -994,7 +994,7 @@ applicable = WMUtils.is_watermarking_applicable( method=method, pdf=str(file_path), position=position ) - if applicable is False: + if applicable &gt;= False: inc_watermark_failed(method, "applicability") app.logger.info( "Watermarking method %s not applicable for document %s",</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 47 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 1 failed, 13 passed, 22 warnings in 21.03s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_407"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_407_1" aria-expanded="false" aria-controls="job_list___sub_collapse_407_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_407_1"><button class="btn btn-outline-success"><span class="job_id">407 : Job ID d029211d56594332a046a1b5dab43a0d</span></button></div></a><div aria-labelledby="job_list___sub_heading_407_1" data-parent="#job_list___sub_accordion_407" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_407_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=74" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (74, 15), end pos: (74, 17)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Is_IsNot, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -71,7 +71,7 @@ def get_engine(): eng = app.config.get("_ENGINE") - if eng is None: + if eng is not None: try: eng = create_engine(db_url(), pool_pre_ping=True, future=True) except Exception as e:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: 'NoneType' object has no attribute 'begin' ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: 'NoneType' object has no attribute 'connect' _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T205627757971Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document 'NoneType' object has no attribute 'connect' __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T205628593543Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: 'NoneType' object has no attribute 'connect' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: 'NoneType' object has no attribute 'begin' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 11 failed, 3 passed, 22 warnings in 20.02s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_408"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_408_1" aria-expanded="false" aria-controls="job_list___sub_collapse_408_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_408_1"><button class="btn btn-outline-success"><span class="job_id">408 : Job ID 8bd445bf06cc4524bd8cb8dc01494b46</span></button></div></a><div aria-labelledby="job_list___sub_heading_408_1" data-parent="#job_list___sub_accordion_408" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_408_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=458" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (458, 23), end pos: (458, 25)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Is_IsNot, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -455,7 +455,7 @@ @require_auth def list_versions(document_id: int | None = None): # Input validation - if document_id is None: + if document_id is not None: document_id = request.args.get("id") or request.args.get("documentid") try: document_id = int(document_id) if document_id else None</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T231059643741Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse 33 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:220: AssertionError ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T231100530798Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 400 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.32s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_409"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_409_1" aria-expanded="false" aria-controls="job_list___sub_collapse_409_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_409_1"><button class="btn btn-outline-success"><span class="job_id">409 : Job ID 092007570545461192353404dcd94a09</span></button></div></a><div aria-labelledby="job_list___sub_heading_409_1" data-parent="#job_list___sub_accordion_409" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_409_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=462" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (462, 31), end pos: (462, 33)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Is_IsNot, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -459,7 +459,7 @@ document_id = request.args.get("id") or request.args.get("documentid") try: document_id = int(document_id) if document_id else None - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is not None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 except (TypeError, ValueError):</pre></div><div class="alert alert-secondary"><pre class="diff">.....F........ [100%] ================================== FAILURES =================================== __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse 33 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:463 Invalid document id in query ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_list_versions_route - assert 400 == 200 1 failed, 13 passed, 22 warnings in 20.55s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_410"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_410_1" aria-expanded="false" aria-controls="job_list___sub_collapse_410_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_410_1"><button class="btn btn-outline-success"><span class="job_id">410 : Job ID 776aff9d84184fefbe632b893348807f</span></button></div></a><div aria-labelledby="job_list___sub_heading_410_1" data-parent="#job_list___sub_accordion_410" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_410_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=469" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (469, 23), end pos: (469, 25)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Is_IsNot, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -466,7 +466,7 @@ app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is not None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: return jsonify({"error": "document id required"}), 400 try:</pre></div><div class="alert alert-secondary"><pre class="diff">...F.F...FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse 33 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:220: AssertionError _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614eb48e2b64635ab109: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_list_versions_route - assert 400 == 200 FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 6 failed, 8 passed, 22 warnings in 19.59s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_411"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_411_1" aria-expanded="false" aria-controls="job_list___sub_collapse_411_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_411_1"><button class="btn btn-outline-success"><span class="job_id">411 : Job ID b9e370c61ef5494e90c6cde7c3a285d8</span></button></div></a><div aria-labelledby="job_list___sub_heading_411_1" data-parent="#job_list___sub_accordion_411" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_411_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=575" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (575, 23), end pos: (575, 25)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Is_IsNot, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -572,7 +572,7 @@ @require_auth def get_document(document_id: int | None = None): # Support both path param and ?id=/ ?documentid= - if document_id is None: + if document_id is not None: document_id = request.args.get("id") or request.args.get("documentid") try: document_id = int(document_id)</pre></div><div class="alert alert-secondary"><pre class="diff">.......F...F.. [100%] ================================== FAILURES =================================== ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") assert resp.status_code == 200 #Test file is deleted resp_deletion = client.get("/api/get-document/2") &gt; assert resp_deletion.status_code == 404 E assert 400 == 404 E + where 400 = &lt;WrapperTestResponse streamed [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:446: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:580 Invalid document id in query ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_delete_document_route - assert 400 == 404 2 failed, 12 passed, 22 warnings in 20.36s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_412"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_412_1" aria-expanded="false" aria-controls="job_list___sub_collapse_412_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_412_1"><button class="btn btn-outline-success"><span class="job_id">412 : Job ID ce8e9ac150fc4228a64eff7f0ede0ca9</span></button></div></a><div aria-labelledby="job_list___sub_heading_412_1" data-parent="#job_list___sub_accordion_412" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_412_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=583" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (583, 23), end pos: (583, 25)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Is_IsNot, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -580,7 +580,7 @@ app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is not None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: return jsonify({"error": "document id required"}), 400 try:</pre></div><div class="alert alert-secondary"><pre class="diff">.......F...F.. [100%] ================================== FAILURES =================================== ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") assert resp.status_code == 200 #Test file is deleted resp_deletion = client.get("/api/get-document/2") &gt; assert resp_deletion.status_code == 404 E assert 400 == 404 E + where 400 = &lt;WrapperTestResponse streamed [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:446: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_delete_document_route - assert 400 == 404 2 failed, 12 passed, 22 warnings in 22.27s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_413"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_413_1" aria-expanded="false" aria-controls="job_list___sub_collapse_413_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_413_1"><button class="btn btn-outline-success"><span class="job_id">413 : Job ID 7fb65b7d3e5244b6a64baf928383f19f</span></button></div></a><div aria-labelledby="job_list___sub_heading_413_1" data-parent="#job_list___sub_accordion_413" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_413_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=813" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (813, 23), end pos: (813, 25)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Is_IsNot, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -810,7 +810,7 @@ or (request.is_json and (request.get_json(silent=True) or {}).get("id")) ) - if document_id is None: + if document_id is not None: app.logger.warning("Document id required for deletion") return jsonify({"error": "document id required"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T030904307583Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T030905285580Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse streamed [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:814 Document id required for deletion ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 400 == 200 8 failed, 6 passed, 22 warnings in 19.38s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_414"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_414_1" aria-expanded="false" aria-controls="job_list___sub_collapse_414_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_414_1"><button class="btn btn-outline-success"><span class="job_id">414 : Job ID 93abdc2e9aba4a49bf99977747d6a49f</span></button></div></a><div aria-labelledby="job_list___sub_heading_414_1" data-parent="#job_list___sub_accordion_414" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_414_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=933" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (933, 22), end pos: (933, 24)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Is_IsNot, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -930,7 +930,7 @@ # validate input try: - if doc_id is None: + if doc_id is not None: app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id)</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 42 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:934 Missing document id in request ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 1 failed, 13 passed, 22 warnings in 19.84s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_415"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_415_1" aria-expanded="false" aria-controls="job_list___sub_collapse_415_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_415_1"><button class="btn btn-outline-success"><span class="job_id">415 : Job ID 71e9b13b9c304548b7fe165cefdf09e0</span></button></div></a><div aria-labelledby="job_list___sub_heading_415_1" data-parent="#job_list___sub_accordion_415" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_415_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=997" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (997, 26), end pos: (997, 28)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Is_IsNot, occurrence: 8</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -994,7 +994,7 @@ applicable = WMUtils.is_watermarking_applicable( method=method, pdf=str(file_path), position=position ) - if applicable is False: + if applicable is not False: inc_watermark_failed(method, "applicability") app.logger.info( "Watermarking method %s not applicable for document %s",</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 47 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 1 failed, 13 passed, 22 warnings in 20.08s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_416"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_416_1" aria-expanded="false" aria-controls="job_list___sub_collapse_416_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_416_1"><button class="btn btn-outline-success"><span class="job_id">416 : Job ID 2008654d9ebe45eaaef8834937bb74f3</span></button></div></a><div aria-labelledby="job_list___sub_heading_416_1" data-parent="#job_list___sub_accordion_416" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_416_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1168" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1168, 22), end pos: (1168, 24)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Is_IsNot, occurrence: 9</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1165,7 +1165,7 @@ # validate input try: - if doc_id is None: + if doc_id is not None: app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id)</pre></div><div class="alert alert-secondary"><pre class="diff">..........F... [100%] ================================== FAILURES =================================== __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 42 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:400: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:1169 Missing document id in request ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 1 failed, 13 passed, 22 warnings in 20.45s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_417"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_417_1" aria-expanded="false" aria-controls="job_list___sub_collapse_417_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_417_1"><button class="btn btn-outline-success"><span class="job_id">417 : Job ID 3a53a8120d914ebd9e110aef2e36ed76</span></button></div></a><div aria-labelledby="job_list___sub_heading_417_1" data-parent="#job_list___sub_accordion_417" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_417_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=84" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (84, 19), end pos: (84, 25)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_IsNot_Is, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -81,7 +81,7 @@ return eng # --- RMAP initialization (skippable in tests) --- - if RMAPHandler is not None: + if RMAPHandler is None: try: RMAPHandler(app, str(app.config["STORAGE_DIR"]), get_engine) except Exception as e: # pragma: no cover - defensive; don't fail app</pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 15.46s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_418"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_418_1" aria-expanded="false" aria-controls="job_list___sub_collapse_418_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_418_1"><button class="btn btn-outline-danger"><span class="job_id">418 : Job ID 1e850900d47d4f95aa41598266d9c055</span></button></div></a><div aria-labelledby="job_list___sub_heading_418_1" data-parent="#job_list___sub_accordion_418" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_418_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=144" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (144, 22), end pos: (144, 28)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_IsNot_Is, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -141,7 +141,7 @@ # capture request size if content-length header present try: cl = request.content_length - if cl is not None: + if cl is None: observe_request_size(request.method, route, cl) except Exception as exc: # pragma: no cover - soft fail app.logger.warning("Request size capture failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.88s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_419"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_419_1" aria-expanded="false" aria-controls="job_list___sub_collapse_419_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_419_1"><button class="btn btn-outline-success"><span class="job_id">419 : Job ID 4585f7ed1d7f4de48ea2ac5aeb87dd65</span></button></div></a><div aria-labelledby="job_list___sub_heading_419_1" data-parent="#job_list___sub_accordion_419" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_419_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=155" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (155, 21), end pos: (155, 27)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_IsNot_Is, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -152,7 +152,7 @@ def _tatou_after(resp): try: start = getattr(request, "_tatou_start", None) - if start is not None: + if start is None: dur = time.time() - start route = request.url_rule.rule if request.url_rule else request.path record_request(request.method, route, resp.status_code, dur)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T053635599166Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T053636431274Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.22s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_420"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_420_1" aria-expanded="false" aria-controls="job_list___sub_collapse_420_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_420_1"><button class="btn btn-outline-success"><span class="job_id">420 : Job ID fa8bfa693faa443e98a6cd15ae9dfe03</span></button></div></a><div aria-labelledby="job_list___sub_heading_420_1" data-parent="#job_list___sub_accordion_420" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_420_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=37" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (37, 3), end pos: (37, 6)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -34,7 +34,7 @@ MAX_DB_INT = (2**63) - 1 RMAPHandler = None # default -if not os.environ.get("TATOU_TEST_DISABLE_RMAP"): +if os.environ.get("TATOU_TEST_DISABLE_RMAP"): try: # Allow tests to disable RMAP dependency via env var from rmap_handler import RMAPHandler as _RMAPHandler # type: ignore </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFFFF [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T001524330438Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T001524567484Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 12 failed, 2 passed, 9 warnings in 13.87s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_421"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_421_1" aria-expanded="false" aria-controls="job_list___sub_collapse_421_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_421_1"><button class="btn btn-outline-danger"><span class="job_id">421 : Job ID dcc67d6fcd5047f8b1970a70b6e65e81</span></button></div></a><div aria-labelledby="job_list___sub_heading_421_1" data-parent="#job_list___sub_accordion_421" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_421_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=105" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (105, 15), end pos: (105, 18)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -102,7 +102,7 @@ g.user = {"id": 1, "login": "username", "email": "user@email.se"} return f(*args, **kwargs) auth = request.headers.get("Authorization", "") - if not auth.startswith("Bearer "): + if auth.startswith("Bearer "): return _auth_error("Missing or invalid Authorization header") token = auth.split(" ", 1)[1].strip() try:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.38s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_422"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_422_1" aria-expanded="false" aria-controls="job_list___sub_collapse_422_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_422_1"><button class="btn btn-outline-success"><span class="job_id">422 : Job ID 7c58bfa8aed64b788f3ad8b297b06c36</span></button></div></a><div aria-labelledby="job_list___sub_heading_422_1" data-parent="#job_list___sub_accordion_422" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_422_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=190" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (190, 11), end pos: (190, 14)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -187,7 +187,7 @@ """Validate user input before database operations""" if len(email) &gt; 320 or len(login) &gt; 64: return False, "Email or login too long" - if not re.match(r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$", email): + if re.match(r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$", email): return False, "Invalid email format" if not re.match(r"^[a-zA-Z0-9_-]{3,64}$", login): return False, "Invalid login format"</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 33 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:213 User input validation failed: Invalid email format ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T004351080357Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T004351938886Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:213 User input validation failed: Invalid email format ERROR server:rmap_handler.py:245 Failed to add source PDF to database: No users exist to own RMAP base document; create a user first ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 400 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 11 failed, 3 passed, 22 warnings in 19.12s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_423"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_423_1" aria-expanded="false" aria-controls="job_list___sub_collapse_423_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_423_1"><button class="btn btn-outline-success"><span class="job_id">423 : Job ID 1ee563c0f4ad42b0bd6aa0cf12bccb70</span></button></div></a><div aria-labelledby="job_list___sub_heading_423_1" data-parent="#job_list___sub_accordion_423" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_423_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=192" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (192, 11), end pos: (192, 14)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -189,7 +189,7 @@ return False, "Email or login too long" if not re.match(r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$", email): return False, "Invalid email format" - if not re.match(r"^[a-zA-Z0-9_-]{3,64}$", login): + if re.match(r"^[a-zA-Z0-9_-]{3,64}$", login): return False, "Invalid login format" return True, "" </pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 33 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:213 User input validation failed: Invalid login format ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T155645323724Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T155646216694Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:213 User input validation failed: Invalid login format ERROR server:rmap_handler.py:245 Failed to add source PDF to database: No users exist to own RMAP base document; create a user first ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 400 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 9 failed, 5 passed, 22 warnings in 19.24s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_424"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_424_1" aria-expanded="false" aria-controls="job_list___sub_collapse_424_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_424_1"><button class="btn btn-outline-success"><span class="job_id">424 : Job ID 7e7f652c7f514504abc33838d2c09ddf</span></button></div></a><div aria-labelledby="job_list___sub_heading_424_1" data-parent="#job_list___sub_accordion_424" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_424_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=204" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (204, 11), end pos: (204, 14)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -201,7 +201,7 @@ login = (payload.get("login") or "").strip() password = payload.get("password") or "" start_db = time.time() - if not email or not login or not password: + if email or not login or not password: app.logger.warning("Missing fields in user creation: %s", payload) return jsonify({"error": "email, login, and password are required"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 52 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:205 Missing fields in user creation: {'email': 'user@email.se', 'login': 'username', 'password': 'password'} ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T011356133882Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T011357055022Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:205 Missing fields in user creation: {'email': 'service@rmap.su', 'login': 'rmap_service', 'password': 'password_rmap'} ERROR server:rmap_handler.py:245 Failed to add source PDF to database: No users exist to own RMAP base document; create a user first ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 400 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 11 failed, 3 passed, 22 warnings in 19.22s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_425"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_425_1" aria-expanded="false" aria-controls="job_list___sub_collapse_425_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_425_1"><button class="btn btn-outline-success"><span class="job_id">425 : Job ID ae779e1d17a242e6889f7d3e68de0a8f</span></button></div></a><div aria-labelledby="job_list___sub_heading_425_1" data-parent="#job_list___sub_accordion_425" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_425_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=204" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (204, 24), end pos: (204, 27)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -201,7 +201,7 @@ login = (payload.get("login") or "").strip() password = payload.get("password") or "" start_db = time.time() - if not email or not login or not password: + if not email or login or not password: app.logger.warning("Missing fields in user creation: %s", payload) return jsonify({"error": "email, login, and password are required"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 52 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:205 Missing fields in user creation: {'email': 'user@email.se', 'login': 'username', 'password': 'password'} ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T040855163564Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T040856096583Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:205 Missing fields in user creation: {'email': 'service@rmap.su', 'login': 'rmap_service', 'password': 'password_rmap'} ERROR server:rmap_handler.py:245 Failed to add source PDF to database: No users exist to own RMAP base document; create a user first ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 400 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 9 failed, 5 passed, 22 warnings in 19.91s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_426"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_426_1" aria-expanded="false" aria-controls="job_list___sub_collapse_426_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_426_1"><button class="btn btn-outline-success"><span class="job_id">426 : Job ID 5b03a07de454481585944f3b5edd75f0</span></button></div></a><div aria-labelledby="job_list___sub_heading_426_1" data-parent="#job_list___sub_accordion_426" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_426_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=204" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (204, 37), end pos: (204, 40)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -201,7 +201,7 @@ login = (payload.get("login") or "").strip() password = payload.get("password") or "" start_db = time.time() - if not email or not login or not password: + if not email or not login or password: app.logger.warning("Missing fields in user creation: %s", payload) return jsonify({"error": "email, login, and password are required"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 52 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:205 Missing fields in user creation: {'email': 'user@email.se', 'login': 'username', 'password': 'password'} ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T000310706490Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T000311658266Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:205 Missing fields in user creation: {'email': 'service@rmap.su', 'login': 'rmap_service', 'password': 'password_rmap'} ERROR server:rmap_handler.py:245 Failed to add source PDF to database: No users exist to own RMAP base document; create a user first ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 400 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 9 failed, 5 passed, 22 warnings in 19.19s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_427"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_427_1" aria-expanded="false" aria-controls="job_list___sub_collapse_427_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_427_1"><button class="btn btn-outline-success"><span class="job_id">427 : Job ID 7a58632f055c4c55ac20b8b45263bf71</span></button></div></a><div aria-labelledby="job_list___sub_heading_427_1" data-parent="#job_list___sub_accordion_427" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_427_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=212" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (212, 15), end pos: (212, 18)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -209,7 +209,7 @@ try: is_valid, error_msg = validate_user_input(email, login) - if not is_valid: + if is_valid: app.logger.warning("User input validation failed: %s", error_msg) return jsonify({"error": error_msg}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 13 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:213 User input validation failed: ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T040643012341Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T040643997675Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:213 User input validation failed: ERROR server:rmap_handler.py:245 Failed to add source PDF to database: No users exist to own RMAP base document; create a user first ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 400 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 9 failed, 5 passed, 22 warnings in 20.46s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_428"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_428_1" aria-expanded="false" aria-controls="job_list___sub_collapse_428_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_428_1"><button class="btn btn-outline-success"><span class="job_id">428 : Job ID 01218160eb394751b2d5d9ece933b0f8</span></button></div></a><div aria-labelledby="job_list___sub_heading_428_1" data-parent="#job_list___sub_accordion_428" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_428_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=248" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (248, 11), end pos: (248, 14)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 8</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -245,7 +245,7 @@ email = (payload.get("email") or "").strip() password = payload.get("password") or "" - if not email or not password: + if email or not password: app.logger.warning("Missing fields in login attempt: %s", payload) return jsonify({"error": "email and password are required"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">..F........... [100%] ================================== FAILURES =================================== ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse 44 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:249 Missing fields in login attempt: {'email': 'user@email.se', 'password': 'password'} ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_login_route - assert 400 == 200 1 failed, 13 passed, 22 warnings in 20.78s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_429"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_429_1" aria-expanded="false" aria-controls="job_list___sub_collapse_429_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_429_1"><button class="btn btn-outline-success"><span class="job_id">429 : Job ID e091a8d818394ad591bc140f392a7b26</span></button></div></a><div aria-labelledby="job_list___sub_heading_429_1" data-parent="#job_list___sub_accordion_429" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_429_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=248" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (248, 24), end pos: (248, 27)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 9</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -245,7 +245,7 @@ email = (payload.get("email") or "").strip() password = payload.get("password") or "" - if not email or not password: + if not email or password: app.logger.warning("Missing fields in login attempt: %s", payload) return jsonify({"error": "email and password are required"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">..F........... [100%] ================================== FAILURES =================================== ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse 44 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:249 Missing fields in login attempt: {'email': 'user@email.se', 'password': 'password'} ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_login_route - assert 400 == 200 1 failed, 13 passed, 22 warnings in 20.53s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_430"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_430_1" aria-expanded="false" aria-controls="job_list___sub_collapse_430_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_430_1"><button class="btn btn-outline-success"><span class="job_id">430 : Job ID 36cde5be94f749ebb9be3f28368824a8</span></button></div></a><div aria-labelledby="job_list___sub_heading_430_1" data-parent="#job_list___sub_accordion_430" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_430_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=271" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (271, 19), end pos: (271, 22)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 10</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -268,7 +268,7 @@ is_valid = False row = None - if not is_valid: + if is_valid: app.logger.warning( "Failed login attempt for email: %s", email if email else "&lt;empty&gt;",</pre></div><div class="alert alert-secondary"><pre class="diff">..F........... [100%] ================================== FAILURES =================================== ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 1 failed, 13 passed, 22 warnings in 20.34s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_431"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_431_1" aria-expanded="false" aria-controls="job_list___sub_collapse_431_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_431_1"><button class="btn btn-outline-success"><span class="job_id">431 : Job ID d8d6e6c84efb4aa18adef375e90e1a70</span></button></div></a><div aria-labelledby="job_list___sub_heading_431_1" data-parent="#job_list___sub_accordion_431" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_431_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=307" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (307, 11), end pos: (307, 14)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 11</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -304,7 +304,7 @@ return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] - if not file or file.filename == "": + if file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">...F.F.F.FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 27 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:308 Upload attempt with empty filename __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 27 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:308 Upload attempt with empty filename _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - assert 400 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 6 failed, 8 passed, 22 warnings in 19.33s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_432"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_432_1" aria-expanded="false" aria-controls="job_list___sub_collapse_432_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_432_1"><button class="btn btn-outline-success"><span class="job_id">432 : Job ID 414789c25a9540cc8a66eaf6c85e7220</span></button></div></a><div aria-labelledby="job_list___sub_heading_432_1" data-parent="#job_list___sub_accordion_432" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_432_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=326" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (326, 11), end pos: (326, 14)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 12</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -323,7 +323,7 @@ "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 - if not file.filename.lower().endswith(".pdf"): + if file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename</pre></div><div class="alert alert-secondary"><pre class="diff">...F.F.F.FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 415 == 201 E + where 415 = &lt;WrapperTestResponse 39 bytes [415 UNSUPPORTED MEDIA TYPE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:328 Upload attempt with invalid file extension: input.pdf __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 415 == 201 E + where 415 = &lt;WrapperTestResponse 39 bytes [415 UNSUPPORTED MEDIA TYPE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:328 Upload attempt with invalid file extension: watermarked.pdf _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - assert 415 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 415 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 6 failed, 8 passed, 22 warnings in 19.22s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_433"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_433_1" aria-expanded="false" aria-controls="job_list___sub_collapse_433_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_433_1"><button class="btn btn-outline-success"><span class="job_id">433 : Job ID 2ebee68cef86425581883d48a7089e45</span></button></div></a><div aria-labelledby="job_list___sub_heading_433_1" data-parent="#job_list___sub_accordion_433" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_433_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=335" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (335, 11), end pos: (335, 14)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 13</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -332,7 +332,7 @@ # Sanitize filename fname = secure_filename(file.filename) - if not fname: + if fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename )</pre></div><div class="alert alert-secondary"><pre class="diff">...F.F.F.FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 29 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:336 Upload attempt with invalid filename: input.pdf __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 29 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:336 Upload attempt with invalid filename: watermarked.pdf _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - assert 400 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 6 failed, 8 passed, 22 warnings in 19.53s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_434"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_434_1" aria-expanded="false" aria-controls="job_list___sub_collapse_434_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_434_1"><button class="btn btn-outline-success"><span class="job_id">434 : Job ID 21fcb2d283794a8cbaf9b8f96320ca28</span></button></div></a><div aria-labelledby="job_list___sub_heading_434_1" data-parent="#job_list___sub_accordion_434" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_434_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=351" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (351, 15), end pos: (351, 18)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 14</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -348,7 +348,7 @@ try: # Check for path traversal attempts stored_path = (user_dir / stored_name).resolve() - if not str(stored_path).startswith(str(user_dir.resolve())): + if str(stored_path).startswith(str(user_dir.resolve())): app.logger.warning("Upload attempt with invalid path: %s", stored_path) return jsonify({"error": "invalid path"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 25 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:352 Upload attempt with invalid path: C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T223419230146Z__input.pdf __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 25 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:352 Upload attempt with invalid path: C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T223420067525Z__watermarked.pdf _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 400 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.60s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_435"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_435_1" aria-expanded="false" aria-controls="job_list___sub_collapse_435_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_435_1"><button class="btn btn-outline-success"><span class="job_id">435 : Job ID 5771a99ff077429c9ae7ec9d5c995612</span></button></div></a><div aria-labelledby="job_list___sub_heading_435_1" data-parent="#job_list___sub_accordion_435" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_435_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=485" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (485, 19), end pos: (485, 22)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 15</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -482,7 +482,7 @@ {"did": document_id, "uid": int(g.user["id"])}, ).first() - if not doc: + if doc: app.logger.warning( "Document not found or access denied for id=%s", document_id )</pre></div><div class="alert alert-secondary"><pre class="diff">.....F........ [100%] ================================== FAILURES =================================== __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 1 failed, 13 passed, 22 warnings in 21.37s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_436"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_436_1" aria-expanded="false" aria-controls="job_list___sub_collapse_436_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_436_1"><button class="btn btn-outline-success"><span class="job_id">436 : Job ID 0230d0d366b640bc87165ed645d626f9</span></button></div></a><div aria-labelledby="job_list___sub_heading_436_1" data-parent="#job_list___sub_accordion_436" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_436_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=529" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (529, 15), end pos: (529, 18)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 16</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -526,7 +526,7 @@ def list_all_versions(): try: # Validate user data from auth token - if not g.user or not g.user.get("id"): + if g.user or not g.user.get("id"): app.logger.error("Missing user info in auth token") return jsonify({"error": "Invalid authentication"}), 401 </pre></div><div class="alert alert-secondary"><pre class="diff">......F....... [100%] ================================== FAILURES =================================== ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 35 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:530 Missing user info in auth token ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_list_all_versions_route - assert 401 == 200 1 failed, 13 passed, 22 warnings in 20.48s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_437"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_437_1" aria-expanded="false" aria-controls="job_list___sub_collapse_437_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_437_1"><button class="btn btn-outline-success"><span class="job_id">437 : Job ID 63e8c13da54046b699d9881b2f959d63</span></button></div></a><div aria-labelledby="job_list___sub_heading_437_1" data-parent="#job_list___sub_accordion_437" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_437_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=529" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (529, 29), end pos: (529, 32)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 17</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -526,7 +526,7 @@ def list_all_versions(): try: # Validate user data from auth token - if not g.user or not g.user.get("id"): + if not g.user or g.user.get("id"): app.logger.error("Missing user info in auth token") return jsonify({"error": "Invalid authentication"}), 401 </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T051957337814Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 35 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:530 Missing user info in auth token ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T051958402354Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 401 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 21.05s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_438"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_438_1" aria-expanded="false" aria-controls="job_list___sub_collapse_438_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_438_1"><button class="btn btn-outline-success"><span class="job_id">438 : Job ID 549e6994c2d0487ab2b514176d284fdd</span></button></div></a><div aria-labelledby="job_list___sub_heading_438_1" data-parent="#job_list___sub_accordion_438" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_438_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=609" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (609, 11), end pos: (609, 14)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 18</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -606,7 +606,7 @@ ), 503 # DonÔÇÖt leak whether a doc exists for another user - if not row: + if row: app.logger.warning( "Document not found or access denied for id=%s", document_id )</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T044252127444Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} &gt; resp = client.get("/api/get-document", query_string=parameters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:273: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1162: in get return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ document_id = 1 @app.get("/api/get-document") @app.get("/api/get-document/&lt;int:document_id&gt;") @require_auth def get_document(document_id: int | None = None): # Support both path param and ?id=/ ?documentid= if document_id is None: document_id = request.args.get("id") or request.args.get("documentid") try: document_id = int(document_id) except (TypeError, ValueError): app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: return jsonify({"error": "document id required"}), 400 try: with get_engine().connect() as conn: row = conn.execute( text( """ SELECT id, name, path, HEX(sha256) AS sha256_hex, size FROM Documents WHERE id = :id AND ownerid = :uid LIMIT 1 """ ), {"id": document_id, "uid": int(g.user["id"])}, ).first() except Exception: app.logger.error( f"Database error in get_document: {document_id},{g.user['id']}" ) inc_db_error("get_document") return jsonify( {"error": "An error occurred while fetching the document"} ), 503 # DonÔÇÖt leak whether a doc exists for another user if row: app.logger.warning( "Document not found or access denied for id=%s", document_id ) return jsonify({"error": "document not found"}), 404 storage_root = app.config["STORAGE_DIR"].resolve() &gt; file_path = Path(row.path) ^^^^^^^^ E AttributeError: 'NoneType' object has no attribute 'path' server.py:616: AttributeError _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T044253148301Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - AttributeError: 'NoneTy... FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 20.69s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_439"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_439_1" aria-expanded="false" aria-controls="job_list___sub_collapse_439_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_439_1"><button class="btn btn-outline-success"><span class="job_id">439 : Job ID bd190cfc90e94a7ea57aac8f71836514</span></button></div></a><div aria-labelledby="job_list___sub_heading_439_1" data-parent="#job_list___sub_accordion_439" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_439_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=629" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (629, 11), end pos: (629, 14)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 19</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -626,7 +626,7 @@ ) return jsonify({"error": "document path invalid"}), 500 - if not resolved.exists(): + if resolved.exists(): app.logger.error("File missing on disk for document id=%s", document_id) return jsonify({"error": "file missing on disk"}), 410 </pre></div><div class="alert alert-secondary"><pre class="diff">...F...F...... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:228: in open request = self._request_from_builder_args(args, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:200: in _request_from_builder_args return builder.get_request() ^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:764: in get_request return cls(self.get_environ()) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:688: in get_environ input_stream, content_length, boundary = stream_encode_multipart( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:130: in stream_encode_multipart write_binary(encoder.send_event(Data(data=chunk, more_data=True))) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:81: in write_binary return stream.write(s) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:630 File missing on disk for document id=1 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_get_document_route - assert False 2 failed, 12 passed, 22 warnings in 21.61s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_440"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_440_1" aria-expanded="false" aria-controls="job_list___sub_collapse_440_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_440_1"><button class="btn btn-outline-danger"><span class="job_id">440 : Job ID 046334d5594c40bab0bc9bbd7c06c6e8</span></button></div></a><div aria-labelledby="job_list___sub_heading_440_1" data-parent="#job_list___sub_accordion_440" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_440_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=654" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (654, 15), end pos: (654, 18)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 20</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -651,7 +651,7 @@ # Prepare safe filename (preserve existing .pdf if present) name = (row.name or "document").strip().replace("\r", "").replace("\n", "") - if not name.lower().endswith(".pdf"): + if name.lower().endswith(".pdf"): name = f"{name}.pdf" # Stat via the same FD to avoid TOCTOU</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.15s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_441"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_441_1" aria-expanded="false" aria-controls="job_list___sub_collapse_441_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_441_1"><button class="btn btn-outline-danger"><span class="job_id">441 : Job ID 1c4eb672ab6941e5a753511155c5a45d</span></button></div></a><div aria-labelledby="job_list___sub_heading_441_1" data-parent="#job_list___sub_accordion_441" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_441_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=696" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (696, 11), end pos: (696, 14)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 21</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -693,7 +693,7 @@ @app.get("/api/get-version/&lt;link&gt;") def get_version(link: str): # Accept both 32-char (RMAP session secrets) and 64-char (SHA-256 style) tokens - if not re.fullmatch(r"[0-9a-f]{32}|[0-9a-f]{64}", link): + if re.fullmatch(r"[0-9a-f]{32}|[0-9a-f]{64}", link): app.logger.warning("Invalid version link format: %s", link) return jsonify({"error": "document not found"}), 404 </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.19s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_442"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_442_1" aria-expanded="false" aria-controls="job_list___sub_collapse_442_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_442_1"><button class="btn btn-outline-danger"><span class="job_id">442 : Job ID 1e94d70d169149348e122cd3e2225864</span></button></div></a><div aria-labelledby="job_list___sub_heading_442_1" data-parent="#job_list___sub_accordion_442" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_442_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=718" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (718, 11), end pos: (718, 14)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 22</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -715,7 +715,7 @@ inc_db_error("get_version") return jsonify({"error": "database error"}), 503 - if not row: + if row: app.logger.warning("Version not found for link: %s", link) return jsonify({"error": "document not found"}), 404 </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.27s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_443"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_443_1" aria-expanded="false" aria-controls="job_list___sub_collapse_443_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_443_1"><button class="btn btn-outline-danger"><span class="job_id">443 : Job ID 240996e4b13f4361810c7651ac9f28de</span></button></div></a><div aria-labelledby="job_list___sub_heading_443_1" data-parent="#job_list___sub_accordion_443" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_443_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=730" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (730, 11), end pos: (730, 14)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 23</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -727,7 +727,7 @@ ) return jsonify({"error": "document path invalid"}), 500 - if not resolved.exists(): + if resolved.exists(): app.logger.error("File missing on disk for version link=%s", link) return jsonify({"error": "file missing on disk"}), 410 </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.97s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_444"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_444_1" aria-expanded="false" aria-controls="job_list___sub_collapse_444_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_444_1"><button class="btn btn-outline-danger"><span class="job_id">444 : Job ID eed71425f54b4ffdbddfe305748babdb</span></button></div></a><div aria-labelledby="job_list___sub_heading_444_1" data-parent="#job_list___sub_accordion_444" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_444_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=784" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (784, 11), end pos: (784, 14)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 24</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -781,7 +781,7 @@ def _safe_resolve_under_storage(p: str, storage_root: Path) -&gt; Path: storage_root = storage_root.resolve() fp = Path(p) - if not fp.is_absolute(): + if fp.is_absolute(): fp = storage_root / fp fp = fp.resolve() # Python 3.12 has is_relative_to on Path</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.80s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_445"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_445_1" aria-expanded="false" aria-controls="job_list___sub_collapse_445_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_445_1"><button class="btn btn-outline-danger"><span class="job_id">445 : Job ID bf6ac641bebf4ce48f902d2c4a9e8c65</span></button></div></a><div aria-labelledby="job_list___sub_heading_445_1" data-parent="#job_list___sub_accordion_445" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_445_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=789" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (789, 15), end pos: (789, 18)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 25</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -786,7 +786,7 @@ fp = fp.resolve() # Python 3.12 has is_relative_to on Path if hasattr(fp, "is_relative_to"): - if not fp.is_relative_to(storage_root): + if fp.is_relative_to(storage_root): raise RuntimeError(f"path {fp} escapes storage root {storage_root}") else: try:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.98s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_446"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_446_1" aria-expanded="false" aria-controls="job_list___sub_collapse_446_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_446_1"><button class="btn btn-outline-success"><span class="job_id">446 : Job ID 75a6d70b847c456d87ceb5cd55f27a5d</span></button></div></a><div aria-labelledby="job_list___sub_heading_446_1" data-parent="#job_list___sub_accordion_446" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_446_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=848" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (848, 11), end pos: (848, 14)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 26</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -845,7 +845,7 @@ inc_db_error("delete_document_select") return jsonify({"error": "database error during delete"}), 503 - if not row: + if row: # DonÔÇÖt reveal othersÔÇÖ docsÔÇöjust say not found app.logger.warning( "Document not found or access denied for deletion id=%s", doc_id</pre></div><div class="alert alert-secondary"><pre class="diff">...........F.. [100%] ================================== FAILURES =================================== _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 1 failed, 13 passed, 22 warnings in 21.65s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_447"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_447_1" aria-expanded="false" aria-controls="job_list___sub_collapse_447_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_447_1"><button class="btn btn-outline-success"><span class="job_id">447 : Job ID 3b5d9ce247f141bd90a055d0bcfc99d8</span></button></div></a><div aria-labelledby="job_list___sub_heading_447_1" data-parent="#job_list___sub_accordion_447" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_447_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=911" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (911, 11), end pos: (911, 14)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 27</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -908,7 +908,7 @@ @require_auth def create_watermark(document_id: int | None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on GET - if not document_id: + if document_id: document_id = ( request.args.get("id") or request.args.get("documentid")</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 42 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:934 Missing document id in request ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 1 failed, 13 passed, 22 warnings in 20.73s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_448"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_448_1" aria-expanded="false" aria-controls="job_list___sub_collapse_448_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_448_1"><button class="btn btn-outline-success"><span class="job_id">448 : Job ID a4cd7441048d4ec587b9ab6412c14406</span></button></div></a><div aria-labelledby="job_list___sub_heading_448_1" data-parent="#job_list___sub_accordion_448" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_448_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=943" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (943, 12), end pos: (943, 15)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 28</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -940,7 +940,7 @@ app.logger.warning("Invalid document id: %s", document_id) return jsonify({"error": "document_id (int) is required"}), 400 if ( - not method + method or not intended_for or not isinstance(secret, str) or not isinstance(key, str)</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 63 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:948 Missing required fields for watermarking: {'id': 1, 'intended_for': 'Mickey Mouse', 'key': 'key', 'method': 'robust-xmp', 'position': 'metadata-only', 'secret': 'secret'} ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 1 failed, 13 passed, 22 warnings in 19.90s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_449"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_449_1" aria-expanded="false" aria-controls="job_list___sub_collapse_449_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_449_1"><button class="btn btn-outline-success"><span class="job_id">449 : Job ID 041e09e22e7f42ddbe4dab499ee8efee</span></button></div></a><div aria-labelledby="job_list___sub_heading_449_1" data-parent="#job_list___sub_accordion_449" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_449_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=944" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (944, 15), end pos: (944, 18)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 29</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -941,7 +941,7 @@ return jsonify({"error": "document_id (int) is required"}), 400 if ( not method - or not intended_for + or intended_for or not isinstance(secret, str) or not isinstance(key, str) ):</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 63 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:948 Missing required fields for watermarking: {'id': 1, 'intended_for': 'Mickey Mouse', 'key': 'key', 'method': 'robust-xmp', 'position': 'metadata-only', 'secret': 'secret'} ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 1 failed, 13 passed, 22 warnings in 20.35s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_450"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_450_1" aria-expanded="false" aria-controls="job_list___sub_collapse_450_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_450_1"><button class="btn btn-outline-success"><span class="job_id">450 : Job ID 1755a94422e1445082d85480bf1b9e5d</span></button></div></a><div aria-labelledby="job_list___sub_heading_450_1" data-parent="#job_list___sub_accordion_450" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_450_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=945" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (945, 15), end pos: (945, 18)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 30</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -942,7 +942,7 @@ if ( not method or not intended_for - or not isinstance(secret, str) + or isinstance(secret, str) or not isinstance(key, str) ): app.logger.warning("Missing required fields for watermarking: %s", payload)</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 63 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:948 Missing required fields for watermarking: {'id': 1, 'intended_for': 'Mickey Mouse', 'key': 'key', 'method': 'robust-xmp', 'position': 'metadata-only', 'secret': 'secret'} ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 1 failed, 13 passed, 22 warnings in 20.14s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_451"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_451_1" aria-expanded="false" aria-controls="job_list___sub_collapse_451_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_451_1"><button class="btn btn-outline-success"><span class="job_id">451 : Job ID b95b3110382442098ab0c9c3f190ea44</span></button></div></a><div aria-labelledby="job_list___sub_heading_451_1" data-parent="#job_list___sub_accordion_451" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_451_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=946" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (946, 15), end pos: (946, 18)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 31</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -943,7 +943,7 @@ not method or not intended_for or not isinstance(secret, str) - or not isinstance(key, str) + or isinstance(key, str) ): app.logger.warning("Missing required fields for watermarking: %s", payload) return jsonify(</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 63 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:948 Missing required fields for watermarking: {'id': 1, 'intended_for': 'Mickey Mouse', 'key': 'key', 'method': 'robust-xmp', 'position': 'metadata-only', 'secret': 'secret'} ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 1 failed, 13 passed, 22 warnings in 20.45s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_452"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_452_1" aria-expanded="false" aria-controls="job_list___sub_collapse_452_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_452_1"><button class="btn btn-outline-success"><span class="job_id">452 : Job ID 473ad834bfc04186b73c85b6735f106f</span></button></div></a><div aria-labelledby="job_list___sub_heading_452_1" data-parent="#job_list___sub_accordion_452" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_452_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=971" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (971, 11), end pos: (971, 14)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 32</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -968,7 +968,7 @@ app.logger.error("Database error fetching document %s", e) return jsonify({"error": "database error"}), 503 - if not row: + if row: app.logger.warning( "Document not found or access denied for watermarking id=%s", doc_id )</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 1 failed, 13 passed, 22 warnings in 20.15s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_453"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_453_1" aria-expanded="false" aria-controls="job_list___sub_collapse_453_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_453_1"><button class="btn btn-outline-success"><span class="job_id">453 : Job ID 05ee35254ab14614bcc33613dcccc24a</span></button></div></a><div aria-labelledby="job_list___sub_heading_453_1" data-parent="#job_list___sub_accordion_453" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_453_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=980" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (980, 11), end pos: (980, 14)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 33</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -977,7 +977,7 @@ # resolve path safely under STORAGE_DIR storage_root = Path(app.config["STORAGE_DIR"]).resolve() file_path = Path(row.path) - if not file_path.is_absolute(): + if file_path.is_absolute(): file_path = storage_root / file_path file_path = file_path.resolve() try:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T020609195823Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T020610124068Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.31s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_454"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_454_1" aria-expanded="false" aria-controls="job_list___sub_collapse_454_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_454_1"><button class="btn btn-outline-success"><span class="job_id">454 : Job ID acf0a246f0c747f685742e9de613ab70</span></button></div></a><div aria-labelledby="job_list___sub_heading_454_1" data-parent="#job_list___sub_accordion_454" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_454_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=988" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (988, 11), end pos: (988, 14)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 34</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -985,7 +985,7 @@ except ValueError: app.logger.warning("Rejected document path for id %s: %s", doc_id, row.path) return jsonify({"error": "document path invalid"}), 500 - if not file_path.exists(): + if file_path.exists(): app.logger.error("File missing on disk for document id=%s", doc_id) return jsonify({"error": "file missing on disk"}), 410 </pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 410 == 201 E + where 410 = &lt;WrapperTestResponse 33 bytes [410 GONE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:989 File missing on disk for document id=1 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 410 == 201 1 failed, 13 passed, 22 warnings in 20.30s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_455"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_455_1" aria-expanded="false" aria-controls="job_list___sub_collapse_455_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_455_1"><button class="btn btn-outline-success"><span class="job_id">455 : Job ID b48a5359dd4a4ce8a23a7b5c1d425256</span></button></div></a><div aria-labelledby="job_list___sub_heading_455_1" data-parent="#job_list___sub_accordion_455" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_455_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1024" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1024, 15), end pos: (1024, 18)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 35</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1021,7 +1021,7 @@ position=position, ) observe_watermark_duration(method, time.time() - _wm_start) - if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: + if isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: inc_watermark_failed(method, "empty_output") app.logger.error( "Watermarking produced no output for document %s using method %s",</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%]</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_456"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_456_1" aria-expanded="false" aria-controls="job_list___sub_collapse_456_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_456_1"><button class="btn btn-outline-success"><span class="job_id">456 : Job ID e0b6fc6c0cea4eaf9f3b99163111e35f</span></button></div></a><div aria-labelledby="job_list___sub_heading_456_1" data-parent="#job_list___sub_accordion_456" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_456_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1148" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1148, 11), end pos: (1148, 14)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 36</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1145,7 +1145,7 @@ @require_auth def read_watermark(document_id: int | None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on POST - if not document_id: + if document_id: document_id = ( request.args.get("id") or request.args.get("documentid")</pre></div><div class="alert alert-secondary"><pre class="diff">..........F... [100%] ================================== FAILURES =================================== __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 42 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:400: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:1169 Missing document id in request ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 1 failed, 13 passed, 22 warnings in 20.42s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_457"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_457_1" aria-expanded="false" aria-controls="job_list___sub_collapse_457_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_457_1"><button class="btn btn-outline-success"><span class="job_id">457 : Job ID 2a616c77f6c24e26bd2d2ebb5e9b0e75</span></button></div></a><div aria-labelledby="job_list___sub_heading_457_1" data-parent="#job_list___sub_accordion_457" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_457_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1177" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1177, 11), end pos: (1177, 14)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 37</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1174,7 +1174,7 @@ except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id) return jsonify({"error": "document_id (int) is required"}), 400 - if not method or not isinstance(method, str) or not isinstance(key, str): + if method or not isinstance(method, str) or not isinstance(key, str): app.logger.warning("Missing required fields for watermarking: %s", payload) return jsonify({"error": "method, and key are required"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">..........F... [100%] ================================== FAILURES =================================== __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 41 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:400: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:1178 Missing required fields for watermarking: {'id': 2, 'key': 'strong-password', 'method': 'overlay-watermark', 'position': 'metadata-only'} ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 1 failed, 13 passed, 22 warnings in 19.83s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_458"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_458_1" aria-expanded="false" aria-controls="job_list___sub_collapse_458_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_458_1"><button class="btn btn-outline-success"><span class="job_id">458 : Job ID f28122d80d2d499ba1c758c84ae56043</span></button></div></a><div aria-labelledby="job_list___sub_heading_458_1" data-parent="#job_list___sub_accordion_458" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_458_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1177" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1177, 25), end pos: (1177, 28)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 38</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1174,7 +1174,7 @@ except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id) return jsonify({"error": "document_id (int) is required"}), 400 - if not method or not isinstance(method, str) or not isinstance(key, str): + if not method or isinstance(method, str) or not isinstance(key, str): app.logger.warning("Missing required fields for watermarking: %s", payload) return jsonify({"error": "method, and key are required"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e1bfc99941133eec5: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.77s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_459"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_459_1" aria-expanded="false" aria-controls="job_list___sub_collapse_459_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_459_1"><button class="btn btn-outline-success"><span class="job_id">459 : Job ID ad25a59778b3446589da2b8db1fe671a</span></button></div></a><div aria-labelledby="job_list___sub_heading_459_1" data-parent="#job_list___sub_accordion_459" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_459_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1177" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1177, 56), end pos: (1177, 59)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 39</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1174,7 +1174,7 @@ except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id) return jsonify({"error": "document_id (int) is required"}), 400 - if not method or not isinstance(method, str) or not isinstance(key, str): + if not method or not isinstance(method, str) or isinstance(key, str): app.logger.warning("Missing required fields for watermarking: %s", payload) return jsonify({"error": "method, and key are required"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">..........F... [100%] ================================== FAILURES =================================== __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 41 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:400: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:1178 Missing required fields for watermarking: {'id': 2, 'key': 'strong-password', 'method': 'overlay-watermark', 'position': 'metadata-only'} ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 1 failed, 13 passed, 22 warnings in 19.79s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_460"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_460_1" aria-expanded="false" aria-controls="job_list___sub_collapse_460_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_460_1"><button class="btn btn-outline-success"><span class="job_id">460 : Job ID 0b2947113ca74d05ab4bb63c1f0b94f7</span></button></div></a><div aria-labelledby="job_list___sub_heading_460_1" data-parent="#job_list___sub_accordion_460" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_460_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1201" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1201, 11), end pos: (1201, 14)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 40</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1198,7 +1198,7 @@ ) return jsonify({"error": "database error"}), 503 - if not row: + if row: app.logger.warning( "Document not found or access denied for watermark read id=%s", doc_id )</pre></div><div class="alert alert-secondary"><pre class="diff">..........F... [100%] ================================== FAILURES =================================== __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:400: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:1202 Document not found or access denied for watermark read id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_read_watermark_route - assert 404 == 201 1 failed, 13 passed, 22 warnings in 20.04s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_461"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_461_1" aria-expanded="false" aria-controls="job_list___sub_collapse_461_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_461_1"><button class="btn btn-outline-danger"><span class="job_id">461 : Job ID 1255c6ad65a64b9891118c1f44974044</span></button></div></a><div aria-labelledby="job_list___sub_heading_461_1" data-parent="#job_list___sub_accordion_461" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_461_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1210" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1210, 11), end pos: (1210, 14)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 41</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1207,7 +1207,7 @@ # resolve path safely under STORAGE_DIR storage_root = Path(app.config["STORAGE_DIR"]).resolve() file_path = Path(row.path) - if not file_path.is_absolute(): + if file_path.is_absolute(): file_path = storage_root / file_path file_path = file_path.resolve() try:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.53s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_462"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_462_1" aria-expanded="false" aria-controls="job_list___sub_collapse_462_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_462_1"><button class="btn btn-outline-success"><span class="job_id">462 : Job ID e910294b331047d89613be87db14d527</span></button></div></a><div aria-labelledby="job_list___sub_heading_462_1" data-parent="#job_list___sub_accordion_462" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_462_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1218" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1218, 11), end pos: (1218, 14)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 42</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1215,7 +1215,7 @@ except ValueError: app.logger.warning("Rejected document path for id %s: %s", doc_id, row.path) return jsonify({"error": "document path invalid"}), 500 - if not file_path.exists(): + if file_path.exists(): app.logger.error("File missing on disk for document id=%s", doc_id) return jsonify({"error": "file missing on disk"}), 410 </pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%]</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_463"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_463_1" aria-expanded="false" aria-controls="job_list___sub_collapse_463_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_463_1"><button class="btn btn-outline-danger"><span class="job_id">463 : Job ID 51d3fdaf59a24599b30b62a04be22a7f</span></button></div></a><div aria-labelledby="job_list___sub_heading_463_1" data-parent="#job_list___sub_accordion_463" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_463_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1249" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1249, 11), end pos: (1249, 14)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 43</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1246,7 +1246,7 @@ @app.get("/metrics") def metrics(): - if not _is_authorized_metrics_request(): + if _is_authorized_metrics_request(): # Obscure existence a bit ÔÇô return 404 instead of 403 to casual scans app.logger.warning( "Unauthorized metrics access attempt from %s", request.remote_addr</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.06s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_464"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_464_1" aria-expanded="false" aria-controls="job_list___sub_collapse_464_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_464_1"><button class="btn btn-outline-success"><span class="job_id">464 : Job ID 8b0998dee97e4846a9cac55231a6c791</span></button></div></a><div aria-labelledby="job_list___sub_heading_464_1" data-parent="#job_list___sub_accordion_464" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_464_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=37" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (37, 3), end pos: (37, 48)</button></a></pre><pre>operator: core/AddNot, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -34,7 +34,7 @@ MAX_DB_INT = (2**63) - 1 RMAPHandler = None # default -if not os.environ.get("TATOU_TEST_DISABLE_RMAP"): +if not not os.environ.get("TATOU_TEST_DISABLE_RMAP"): try: # Allow tests to disable RMAP dependency via env var from rmap_handler import RMAPHandler as _RMAPHandler # type: ignore </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFFFF [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T031721917928Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T031722251569Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 11 failed, 3 passed, 9 warnings in 13.99s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_465"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_465_1" aria-expanded="false" aria-controls="job_list___sub_collapse_465_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_465_1"><button class="btn btn-outline-success"><span class="job_id">465 : Job ID 2d082808ccf843a9866309e7d2d284da</span></button></div></a><div aria-labelledby="job_list___sub_heading_465_1" data-parent="#job_list___sub_accordion_465" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_465_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=74" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (74, 11), end pos: (74, 22)</button></a></pre><pre>operator: core/AddNot, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -71,7 +71,7 @@ def get_engine(): eng = app.config.get("_ENGINE") - if eng is None: + if not eng is None: try: eng = create_engine(db_url(), pool_pre_ping=True, future=True) except Exception as e:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: 'NoneType' object has no attribute 'begin' ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: 'NoneType' object has no attribute 'connect' _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T223358858725Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document 'NoneType' object has no attribute 'connect' __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T223359585742Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: 'NoneType' object has no attribute 'connect' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: 'NoneType' object has no attribute 'begin' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 11 failed, 3 passed, 22 warnings in 19.16s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_466"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_466_1" aria-expanded="false" aria-controls="job_list___sub_collapse_466_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_466_1"><button class="btn btn-outline-success"><span class="job_id">466 : Job ID 66e9dd1baa634e9a95f5f255e853cc39</span></button></div></a><div aria-labelledby="job_list___sub_heading_466_1" data-parent="#job_list___sub_accordion_466" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_466_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=84" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (84, 7), end pos: (84, 30)</button></a></pre><pre>operator: core/AddNot, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -81,7 +81,7 @@ return eng # --- RMAP initialization (skippable in tests) --- - if RMAPHandler is not None: + if not RMAPHandler is not None: try: RMAPHandler(app, str(app.config["STORAGE_DIR"]), get_engine) except Exception as e: # pragma: no cover - defensive; don't fail app</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFFFF [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T200023741880Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T200023966265Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 12 failed, 2 passed, 9 warnings in 13.81s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_467"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_467_1" aria-expanded="false" aria-controls="job_list___sub_collapse_467_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_467_1"><button class="btn btn-outline-success"><span class="job_id">467 : Job ID 97b5b01f25c74a489c775716ee5d9a72</span></button></div></a><div aria-labelledby="job_list___sub_heading_467_1" data-parent="#job_list___sub_accordion_467" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_467_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=101" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (101, 15), end pos: (101, 36)</button></a></pre><pre>operator: core/AddNot, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -98,7 +98,7 @@ def require_auth(f): @wraps(f) def wrapper(*args, **kwargs): - if app.config['TESTING']: + if not app.config['TESTING']: g.user = {"id": 1, "login": "username", "email": "user@email.se"} return f(*args, **kwargs) auth = request.headers.get("Authorization", "")</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 401 == 201 E + where 401 = &lt;WrapperTestResponse 52 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:95 Auth error (401): Missing or invalid Authorization header __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 52 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:95 Auth error (401): Missing or invalid Authorization header __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 52 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:95 Auth error (401): Missing or invalid Authorization header ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 52 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:95 Auth error (401): Missing or invalid Authorization header ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:95 Auth error (401): Missing or invalid Authorization header _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 401 == 201 E + where 401 = &lt;WrapperTestResponse 52 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:95 Auth error (401): Missing or invalid Authorization header __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 401 == 201 E + where 401 = &lt;WrapperTestResponse 52 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:95 Auth error (401): Missing or invalid Authorization header _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse streamed [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:95 Auth error (401): Missing or invalid Authorization header ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 401 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 401 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 401 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 401 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 401 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 401 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 401 == 200 10 failed, 4 passed, 22 warnings in 19.11s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_468"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_468_1" aria-expanded="false" aria-controls="job_list___sub_collapse_468_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_468_1"><button class="btn btn-outline-danger"><span class="job_id">468 : Job ID 10f664bdcd5e45e0afc509bfb0dae6f2</span></button></div></a><div aria-labelledby="job_list___sub_heading_468_1" data-parent="#job_list___sub_accordion_468" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_468_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=105" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (105, 15), end pos: (105, 45)</button></a></pre><pre>operator: core/AddNot, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -102,7 +102,7 @@ g.user = {"id": 1, "login": "username", "email": "user@email.se"} return f(*args, **kwargs) auth = request.headers.get("Authorization", "") - if not auth.startswith("Bearer "): + if not not auth.startswith("Bearer "): return _auth_error("Missing or invalid Authorization header") token = auth.split(" ", 1)[1].strip() try:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.84s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_469"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_469_1" aria-expanded="false" aria-controls="job_list___sub_collapse_469_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_469_1"><button class="btn btn-outline-danger"><span class="job_id">469 : Job ID d1b4bca440684820896d947549440961</span></button></div></a><div aria-labelledby="job_list___sub_heading_469_1" data-parent="#job_list___sub_accordion_469" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_469_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=139" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (139, 45), end pos: (139, 61)</button></a></pre><pre>operator: core/AddNot, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -136,7 +136,7 @@ def _tatou_before(): try: # record start for latency request._tatou_start = time.time() # type: ignore[attr-defined] - route = request.url_rule.rule if request.url_rule else request.path + route = request.url_rule.rule if not request.url_rule else request.path inc_inflight(route) # capture request size if content-length header present try:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.09s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_470"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_470_1" aria-expanded="false" aria-controls="job_list___sub_collapse_470_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_470_1"><button class="btn btn-outline-success"><span class="job_id">470 : Job ID fd68c2cafb4f4e33b8361c9c46b00664</span></button></div></a><div aria-labelledby="job_list___sub_heading_470_1" data-parent="#job_list___sub_accordion_470" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_470_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=144" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (144, 19), end pos: (144, 33)</button></a></pre><pre>operator: core/AddNot, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -141,7 +141,7 @@ # capture request size if content-length header present try: cl = request.content_length - if cl is not None: + if not cl is not None: observe_request_size(request.method, route, cl) except Exception as exc: # pragma: no cover - soft fail app.logger.warning("Request size capture failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T211426149062Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T211427309130Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 21.74s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_471"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_471_1" aria-expanded="false" aria-controls="job_list___sub_collapse_471_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_471_1"><button class="btn btn-outline-success"><span class="job_id">471 : Job ID 3554978fd3304f9b88957c1c07393ccd</span></button></div></a><div aria-labelledby="job_list___sub_heading_471_1" data-parent="#job_list___sub_accordion_471" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_471_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=155" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (155, 15), end pos: (155, 32)</button></a></pre><pre>operator: core/AddNot, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -152,7 +152,7 @@ def _tatou_after(resp): try: start = getattr(request, "_tatou_start", None) - if start is not None: + if not start is not None: dur = time.time() - start route = request.url_rule.rule if request.url_rule else request.path record_request(request.method, route, resp.status_code, dur)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T035148053628Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T035148971652Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 20.39s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_472"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_472_1" aria-expanded="false" aria-controls="job_list___sub_collapse_472_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_472_1"><button class="btn btn-outline-danger"><span class="job_id">472 : Job ID de816d855f734d6891b4f1d00161a76d</span></button></div></a><div aria-labelledby="job_list___sub_heading_472_1" data-parent="#job_list___sub_accordion_472" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_472_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=157" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (157, 49), end pos: (157, 65)</button></a></pre><pre>operator: core/AddNot, occurrence: 8</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -154,7 +154,7 @@ start = getattr(request, "_tatou_start", None) if start is not None: dur = time.time() - start - route = request.url_rule.rule if request.url_rule else request.path + route = request.url_rule.rule if not request.url_rule else request.path record_request(request.method, route, resp.status_code, dur) except Exception as exc: # pragma: no cover - defensive app.logger.warning("after_request instrumentation failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.34s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_473"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_473_1" aria-expanded="false" aria-controls="job_list___sub_collapse_473_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_473_1"><button class="btn btn-outline-success"><span class="job_id">473 : Job ID 34f898f6854d4cfd88a98b9ae367e233</span></button></div></a><div aria-labelledby="job_list___sub_heading_473_1" data-parent="#job_list___sub_accordion_473" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_473_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=188" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (188, 11), end pos: (188, 46)</button></a></pre><pre>operator: core/AddNot, occurrence: 9</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -185,7 +185,7 @@ # Extra backend validation for user input def validate_user_input(email: str, login: str) -&gt; tuple[bool, str]: """Validate user input before database operations""" - if len(email) &gt; 320 or len(login) &gt; 64: + if not len(email) &gt; 320 or len(login) &gt; 64: return False, "Email or login too long" if not re.match(r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$", email): return False, "Invalid email format"</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 36 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:213 User input validation failed: Email or login too long ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T043327436610Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T043328453761Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:213 User input validation failed: Email or login too long ERROR server:rmap_handler.py:245 Failed to add source PDF to database: No users exist to own RMAP base document; create a user first ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 400 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 9 failed, 5 passed, 22 warnings in 19.86s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_474"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_474_1" aria-expanded="false" aria-controls="job_list___sub_collapse_474_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_474_1"><button class="btn btn-outline-success"><span class="job_id">474 : Job ID 2b81c25262e0435786904052cfd135df</span></button></div></a><div aria-labelledby="job_list___sub_heading_474_1" data-parent="#job_list___sub_accordion_474" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_474_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=190" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (190, 11), end pos: (190, 83)</button></a></pre><pre>operator: core/AddNot, occurrence: 10</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -187,7 +187,7 @@ """Validate user input before database operations""" if len(email) &gt; 320 or len(login) &gt; 64: return False, "Email or login too long" - if not re.match(r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$", email): + if not not re.match(r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$", email): return False, "Invalid email format" if not re.match(r"^[a-zA-Z0-9_-]{3,64}$", login): return False, "Invalid login format"</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 33 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:213 User input validation failed: Invalid email format ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T145554121275Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T145555020738Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:213 User input validation failed: Invalid email format ERROR server:rmap_handler.py:245 Failed to add source PDF to database: No users exist to own RMAP base document; create a user first ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 400 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 9 failed, 5 passed, 22 warnings in 19.14s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_475"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_475_1" aria-expanded="false" aria-controls="job_list___sub_collapse_475_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_475_1"><button class="btn btn-outline-success"><span class="job_id">475 : Job ID e1c0cc30f18846bc80372c848b5f8788</span></button></div></a><div aria-labelledby="job_list___sub_heading_475_1" data-parent="#job_list___sub_accordion_475" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_475_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=192" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (192, 11), end pos: (192, 56)</button></a></pre><pre>operator: core/AddNot, occurrence: 11</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -189,7 +189,7 @@ return False, "Email or login too long" if not re.match(r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$", email): return False, "Invalid email format" - if not re.match(r"^[a-zA-Z0-9_-]{3,64}$", login): + if not not re.match(r"^[a-zA-Z0-9_-]{3,64}$", login): return False, "Invalid login format" return True, "" </pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 33 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:213 User input validation failed: Invalid login format ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T213617036713Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T213618095161Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:213 User input validation failed: Invalid login format ERROR server:rmap_handler.py:245 Failed to add source PDF to database: No users exist to own RMAP base document; create a user first ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 400 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 9 failed, 5 passed, 22 warnings in 20.56s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_476"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_476_1" aria-expanded="false" aria-controls="job_list___sub_collapse_476_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_476_1"><button class="btn btn-outline-success"><span class="job_id">476 : Job ID 7d7f7bde127b490e848aec5b1be073cb</span></button></div></a><div aria-labelledby="job_list___sub_heading_476_1" data-parent="#job_list___sub_accordion_476" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_476_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=204" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (204, 11), end pos: (204, 49)</button></a></pre><pre>operator: core/AddNot, occurrence: 12</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -201,7 +201,7 @@ login = (payload.get("login") or "").strip() password = payload.get("password") or "" start_db = time.time() - if not email or not login or not password: + if not not email or not login or not password: app.logger.warning("Missing fields in user creation: %s", payload) return jsonify({"error": "email, login, and password are required"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 52 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:205 Missing fields in user creation: {'email': 'user@email.se', 'login': 'username', 'password': 'password'} ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T232032699243Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T232033674852Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:205 Missing fields in user creation: {'email': 'service@rmap.su', 'login': 'rmap_service', 'password': 'password_rmap'} ERROR server:rmap_handler.py:245 Failed to add source PDF to database: No users exist to own RMAP base document; create a user first ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 400 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 9 failed, 5 passed, 22 warnings in 18.95s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_477"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_477_1" aria-expanded="false" aria-controls="job_list___sub_collapse_477_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_477_1"><button class="btn btn-outline-success"><span class="job_id">477 : Job ID 1a956df509f940418bc84c4d4cd78f4b</span></button></div></a><div aria-labelledby="job_list___sub_heading_477_1" data-parent="#job_list___sub_accordion_477" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_477_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=212" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (212, 15), end pos: (212, 27)</button></a></pre><pre>operator: core/AddNot, occurrence: 13</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -209,7 +209,7 @@ try: is_valid, error_msg = validate_user_input(email, login) - if not is_valid: + if not not is_valid: app.logger.warning("User input validation failed: %s", error_msg) return jsonify({"error": error_msg}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 13 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:213 User input validation failed: ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T201828485096Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T201829396459Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:213 User input validation failed: ERROR server:rmap_handler.py:245 Failed to add source PDF to database: No users exist to own RMAP base document; create a user first ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 400 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 9 failed, 5 passed, 22 warnings in 19.55s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_478"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_478_1" aria-expanded="false" aria-controls="job_list___sub_collapse_478_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_478_1"><button class="btn btn-outline-success"><span class="job_id">478 : Job ID fc2caeee16be4acdbb79ea483b8c1c09</span></button></div></a><div aria-labelledby="job_list___sub_heading_478_1" data-parent="#job_list___sub_accordion_478" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_478_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=248" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (248, 11), end pos: (248, 36)</button></a></pre><pre>operator: core/AddNot, occurrence: 14</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -245,7 +245,7 @@ email = (payload.get("email") or "").strip() password = payload.get("password") or "" - if not email or not password: + if not not email or not password: app.logger.warning("Missing fields in login attempt: %s", payload) return jsonify({"error": "email and password are required"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">..F........... [100%] ================================== FAILURES =================================== ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse 44 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:249 Missing fields in login attempt: {'email': 'user@email.se', 'password': 'password'} ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_login_route - assert 400 == 200 1 failed, 13 passed, 22 warnings in 20.34s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_479"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_479_1" aria-expanded="false" aria-controls="job_list___sub_collapse_479_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_479_1"><button class="btn btn-outline-success"><span class="job_id">479 : Job ID a261be8a521141288d5595a4ffe77623</span></button></div></a><div aria-labelledby="job_list___sub_heading_479_1" data-parent="#job_list___sub_accordion_479" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_479_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=264" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (264, 19), end pos: (264, 22)</button></a></pre><pre>operator: core/AddNot, occurrence: 15</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -261,7 +261,7 @@ ).first() # Constant-time comparison to prevent timing attacks - if row: + if not row: is_valid = check_password_hash(row.hpassword, password) else: # Dummy check to maintain constant time</pre></div><div class="alert alert-secondary"><pre class="diff">..F........... [100%] ================================== FAILURES =================================== ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 1 failed, 13 passed, 22 warnings in 20.23s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_480"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_480_1" aria-expanded="false" aria-controls="job_list___sub_collapse_480_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_480_1"><button class="btn btn-outline-success"><span class="job_id">480 : Job ID a5c5e10831ee437c93a79f8faf0a1524</span></button></div></a><div aria-labelledby="job_list___sub_heading_480_1" data-parent="#job_list___sub_accordion_480" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_480_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=271" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (271, 19), end pos: (271, 31)</button></a></pre><pre>operator: core/AddNot, occurrence: 16</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -268,7 +268,7 @@ is_valid = False row = None - if not is_valid: + if not not is_valid: app.logger.warning( "Failed login attempt for email: %s", email if email else "&lt;empty&gt;",</pre></div><div class="alert alert-secondary"><pre class="diff">..F........... [100%] ================================== FAILURES =================================== ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 1 failed, 13 passed, 22 warnings in 20.41s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_481"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_481_1" aria-expanded="false" aria-controls="job_list___sub_collapse_481_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_481_1"><button class="btn btn-outline-danger"><span class="job_id">481 : Job ID 41b0f81e07134d72aa4302d54bcd1123</span></button></div></a><div aria-labelledby="job_list___sub_heading_481_1" data-parent="#job_list___sub_accordion_481" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_481_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=274" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (274, 33), end pos: (274, 38)</button></a></pre><pre>operator: core/AddNot, occurrence: 17</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -271,7 +271,7 @@ if not is_valid: app.logger.warning( "Failed login attempt for email: %s", - email if email else "&lt;empty&gt;", + email if not email else "&lt;empty&gt;", ) inc_login_failure("invalid_credentials") return jsonify({"error": "invalid credentials"}), 401</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.06s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_482"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_482_1" aria-expanded="false" aria-controls="job_list___sub_collapse_482_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_482_1"><button class="btn btn-outline-success"><span class="job_id">482 : Job ID 9a432e50a35548d2b4a186fe070faea9</span></button></div></a><div aria-labelledby="job_list___sub_heading_482_1" data-parent="#job_list___sub_accordion_482" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_482_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=301" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (301, 11), end pos: (301, 38)</button></a></pre><pre>operator: core/AddNot, occurrence: 18</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -298,7 +298,7 @@ @app.post("/api/upload-document") @require_auth def upload_document(): - if "file" not in request.files: + if not "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400</pre></div><div class="alert alert-secondary"><pre class="diff">...F.F.F.FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 51 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 51 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - assert 400 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 6 failed, 8 passed, 22 warnings in 20.04s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_483"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_483_1" aria-expanded="false" aria-controls="job_list___sub_collapse_483_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_483_1"><button class="btn btn-outline-success"><span class="job_id">483 : Job ID b1697197c9764ea3bc9d9ba23b6f9209</span></button></div></a><div aria-labelledby="job_list___sub_heading_483_1" data-parent="#job_list___sub_accordion_483" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_483_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=307" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (307, 11), end pos: (307, 42)</button></a></pre><pre>operator: core/AddNot, occurrence: 19</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -304,7 +304,7 @@ return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] - if not file or file.filename == "": + if not not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">...F.F.F.FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 27 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:308 Upload attempt with empty filename __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 27 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:308 Upload attempt with empty filename _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - assert 400 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 6 failed, 8 passed, 22 warnings in 19.35s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_484"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_484_1" aria-expanded="false" aria-controls="job_list___sub_collapse_484_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_484_1"><button class="btn btn-outline-success"><span class="job_id">484 : Job ID 61d87d5063034ab3b8aacbcc298a9f1c</span></button></div></a><div aria-labelledby="job_list___sub_heading_484_1" data-parent="#job_list___sub_accordion_484" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_484_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=314" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (314, 11), end pos: (314, 70)</button></a></pre><pre>operator: core/AddNot, occurrence: 20</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -311,7 +311,7 @@ start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB - if file.content_length and file.content_length &gt; MAX_FILE_SIZE: + if not file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413</pre></div><div class="alert alert-secondary"><pre class="diff">...F.......... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') &gt; assert resp.status_code == 413 E assert 500 == 413 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:181: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field ERROR server:server.py:357 File save error: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - assert 500 == 413 1 failed, 13 passed, 22 warnings in 20.57s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_485"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_485_1" aria-expanded="false" aria-controls="job_list___sub_collapse_485_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_485_1"><button class="btn btn-outline-success"><span class="job_id">485 : Job ID ff0ae9358e5048b19d278ddc7156fd19</span></button></div></a><div aria-labelledby="job_list___sub_heading_485_1" data-parent="#job_list___sub_accordion_485" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_485_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=320" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (320, 11), end pos: (320, 45)</button></a></pre><pre>operator: core/AddNot, occurrence: 21</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -317,7 +317,7 @@ return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type - if file.mimetype != "application/pdf": + if not file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype</pre></div><div class="alert alert-secondary"><pre class="diff">...F.F.F.FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 415 == 201 E + where 415 = &lt;WrapperTestResponse 39 bytes [415 UNSUPPORTED MEDIA TYPE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:322 Upload attempt with invalid MIME type: application/pdf __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 415 == 201 E + where 415 = &lt;WrapperTestResponse 39 bytes [415 UNSUPPORTED MEDIA TYPE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:322 Upload attempt with invalid MIME type: application/pdf _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - assert 415 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 415 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 6 failed, 8 passed, 22 warnings in 19.09s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_486"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_486_1" aria-expanded="false" aria-controls="job_list___sub_collapse_486_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_486_1"><button class="btn btn-outline-success"><span class="job_id">486 : Job ID 15a97113909c4fd0a232be8541cdaabf</span></button></div></a><div aria-labelledby="job_list___sub_heading_486_1" data-parent="#job_list___sub_accordion_486" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_486_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=326" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (326, 11), end pos: (326, 53)</button></a></pre><pre>operator: core/AddNot, occurrence: 22</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -323,7 +323,7 @@ "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 - if not file.filename.lower().endswith(".pdf"): + if not not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename</pre></div><div class="alert alert-secondary"><pre class="diff">...F.F.F.FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 415 == 201 E + where 415 = &lt;WrapperTestResponse 39 bytes [415 UNSUPPORTED MEDIA TYPE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:328 Upload attempt with invalid file extension: input.pdf __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 415 == 201 E + where 415 = &lt;WrapperTestResponse 39 bytes [415 UNSUPPORTED MEDIA TYPE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:328 Upload attempt with invalid file extension: watermarked.pdf _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - assert 415 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 415 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 6 failed, 8 passed, 22 warnings in 19.16s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_487"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_487_1" aria-expanded="false" aria-controls="job_list___sub_collapse_487_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_487_1"><button class="btn btn-outline-success"><span class="job_id">487 : Job ID 4599aed562994439b5c843c51bdb23a2</span></button></div></a><div aria-labelledby="job_list___sub_heading_487_1" data-parent="#job_list___sub_accordion_487" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_487_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=335" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (335, 11), end pos: (335, 20)</button></a></pre><pre>operator: core/AddNot, occurrence: 23</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -332,7 +332,7 @@ # Sanitize filename fname = secure_filename(file.filename) - if not fname: + if not not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename )</pre></div><div class="alert alert-secondary"><pre class="diff">...F.F.F.FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 29 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:336 Upload attempt with invalid filename: input.pdf __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 29 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:336 Upload attempt with invalid filename: watermarked.pdf _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - assert 400 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 6 failed, 8 passed, 22 warnings in 19.11s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_488"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_488_1" aria-expanded="false" aria-controls="job_list___sub_collapse_488_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_488_1"><button class="btn btn-outline-success"><span class="job_id">488 : Job ID 533acc7e10e549aab8687df8c9d38f8a</span></button></div></a><div aria-labelledby="job_list___sub_heading_488_1" data-parent="#job_list___sub_accordion_488" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_488_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=351" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (351, 15), end pos: (351, 71)</button></a></pre><pre>operator: core/AddNot, occurrence: 24</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -348,7 +348,7 @@ try: # Check for path traversal attempts stored_path = (user_dir / stored_name).resolve() - if not str(stored_path).startswith(str(user_dir.resolve())): + if not not str(stored_path).startswith(str(user_dir.resolve())): app.logger.warning("Upload attempt with invalid path: %s", stored_path) return jsonify({"error": "invalid path"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">...F.F.F.FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 25 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:352 Upload attempt with invalid path: C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T192728549425Z__input.pdf __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 25 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:352 Upload attempt with invalid path: C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T192729606749Z__watermarked.pdf _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - assert 400 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 6 failed, 8 passed, 22 warnings in 19.57s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_489"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_489_1" aria-expanded="false" aria-controls="job_list___sub_collapse_489_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_489_1"><button class="btn btn-outline-danger"><span class="job_id">489 : Job ID e1e16b8f2b8b42e39cc31c953ae4cfc2</span></button></div></a><div aria-labelledby="job_list___sub_heading_489_1" data-parent="#job_list___sub_accordion_489" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_489_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=406" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (406, 15), end pos: (406, 49)</button></a></pre><pre>operator: core/AddNot, occurrence: 25</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -403,7 +403,7 @@ "id": int(row.id), "name": row.name, "creation": row.creation.isoformat() - if hasattr(row.creation, "isoformat") + if not hasattr(row.creation, "isoformat") else str(row.creation), "sha256": row.sha256_hex, "size": int(row.size),</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.10s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_490"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_490_1" aria-expanded="false" aria-controls="job_list___sub_collapse_490_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_490_1"><button class="btn btn-outline-danger"><span class="job_id">490 : Job ID b514a843a2b7494fb82899e01a902212</span></button></div></a><div aria-labelledby="job_list___sub_heading_490_1" data-parent="#job_list___sub_accordion_490" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_490_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=443" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (443, 19), end pos: (443, 51)</button></a></pre><pre>operator: core/AddNot, occurrence: 26</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -440,7 +440,7 @@ "id": int(r.id), "name": r.name, "creation": r.creation.isoformat() - if hasattr(r.creation, "isoformat") + if not hasattr(r.creation, "isoformat") else str(r.creation), "sha256": r.sha256_hex, "size": int(r.size),</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.70s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_491"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_491_1" aria-expanded="false" aria-controls="job_list___sub_collapse_491_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_491_1"><button class="btn btn-outline-success"><span class="job_id">491 : Job ID eca8c793bf2245dfa07e9670273ef27b</span></button></div></a><div aria-labelledby="job_list___sub_heading_491_1" data-parent="#job_list___sub_accordion_491" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_491_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=458" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (458, 11), end pos: (458, 30)</button></a></pre><pre>operator: core/AddNot, occurrence: 27</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -455,7 +455,7 @@ @require_auth def list_versions(document_id: int | None = None): # Input validation - if document_id is None: + if not document_id is None: document_id = request.args.get("id") or request.args.get("documentid") try: document_id = int(document_id) if document_id else None</pre></div><div class="alert alert-secondary"><pre class="diff">.....F........ [100%] ================================== FAILURES =================================== __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse 33 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:220: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_list_versions_route - assert 400 == 200 1 failed, 13 passed, 22 warnings in 20.38s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_492"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_492_1" aria-expanded="false" aria-controls="job_list___sub_collapse_492_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_492_1"><button class="btn btn-outline-success"><span class="job_id">492 : Job ID c86c04281a9645d4a8f9cfaa1d0a0b99</span></button></div></a><div aria-labelledby="job_list___sub_heading_492_1" data-parent="#job_list___sub_accordion_492" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_492_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=461" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (461, 50), end pos: (461, 61)</button></a></pre><pre>operator: core/AddNot, occurrence: 28</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -458,7 +458,7 @@ if document_id is None: document_id = request.args.get("id") or request.args.get("documentid") try: - document_id = int(document_id) if document_id else None + document_id = int(document_id) if not document_id else None if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400</pre></div><div class="alert alert-secondary"><pre class="diff">.....F........ [100%] ================================== FAILURES =================================== __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse 33 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:463 Invalid document id in query ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_list_versions_route - assert 400 == 200 1 failed, 13 passed, 22 warnings in 20.22s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_493"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_493_1" aria-expanded="false" aria-controls="job_list___sub_collapse_493_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_493_1"><button class="btn btn-outline-success"><span class="job_id">493 : Job ID 3c47b64c45994712a98b04e37a948da6</span></button></div></a><div aria-labelledby="job_list___sub_heading_493_1" data-parent="#job_list___sub_accordion_493" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_493_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=462" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (462, 19), end pos: (462, 86)</button></a></pre><pre>operator: core/AddNot, occurrence: 29</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -459,7 +459,7 @@ document_id = request.args.get("id") or request.args.get("documentid") try: document_id = int(document_id) if document_id else None - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if not document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 except (TypeError, ValueError):</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T031458563050Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse 33 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:463 Invalid document id in query ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T031459517386Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 400 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.92s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_494"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_494_1" aria-expanded="false" aria-controls="job_list___sub_collapse_494_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_494_1"><button class="btn btn-outline-success"><span class="job_id">494 : Job ID dd8186289d49437aaa8876bf9114e689</span></button></div></a><div aria-labelledby="job_list___sub_heading_494_1" data-parent="#job_list___sub_accordion_494" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_494_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=469" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (469, 11), end pos: (469, 78)</button></a></pre><pre>operator: core/AddNot, occurrence: 30</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -466,7 +466,7 @@ app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if not document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: return jsonify({"error": "document id required"}), 400 try:</pre></div><div class="alert alert-secondary"><pre class="diff">...F.F...FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse 33 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:220: AssertionError _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e3ada16812490f1bb: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_list_versions_route - assert 400 == 200 FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 6 failed, 8 passed, 22 warnings in 21.55s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_495"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_495_1" aria-expanded="false" aria-controls="job_list___sub_collapse_495_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_495_1"><button class="btn btn-outline-success"><span class="job_id">495 : Job ID d5eb8678b7ce49049f2f5849d84d85e7</span></button></div></a><div aria-labelledby="job_list___sub_heading_495_1" data-parent="#job_list___sub_accordion_495" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_495_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=485" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (485, 19), end pos: (485, 26)</button></a></pre><pre>operator: core/AddNot, occurrence: 31</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -482,7 +482,7 @@ {"did": document_id, "uid": int(g.user["id"])}, ).first() - if not doc: + if not not doc: app.logger.warning( "Document not found or access denied for id=%s", document_id )</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T041513367534Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T041514725482Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 21.92s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_496"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_496_1" aria-expanded="false" aria-controls="job_list___sub_collapse_496_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_496_1"><button class="btn btn-outline-success"><span class="job_id">496 : Job ID 6dc3e407b3504627b5c0b1bba39787e8</span></button></div></a><div aria-labelledby="job_list___sub_heading_496_1" data-parent="#job_list___sub_accordion_496" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_496_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=529" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (529, 15), end pos: (529, 49)</button></a></pre><pre>operator: core/AddNot, occurrence: 32</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -526,7 +526,7 @@ def list_all_versions(): try: # Validate user data from auth token - if not g.user or not g.user.get("id"): + if not not g.user or not g.user.get("id"): app.logger.error("Missing user info in auth token") return jsonify({"error": "Invalid authentication"}), 401 </pre></div><div class="alert alert-secondary"><pre class="diff">...F..F..FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 35 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:530 Missing user info in auth token _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614eceb130736ddb771c: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_list_all_versions_route - assert 401 == 200 FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 6 failed, 8 passed, 22 warnings in 23.71s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_497"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_497_1" aria-expanded="false" aria-controls="job_list___sub_collapse_497_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_497_1"><button class="btn btn-outline-success"><span class="job_id">497 : Job ID 44ee70d37e2d40a699038e8e2c14a9ad</span></button></div></a><div aria-labelledby="job_list___sub_heading_497_1" data-parent="#job_list___sub_accordion_497" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_497_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=575" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (575, 11), end pos: (575, 30)</button></a></pre><pre>operator: core/AddNot, occurrence: 33</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -572,7 +572,7 @@ @require_auth def get_document(document_id: int | None = None): # Support both path param and ?id=/ ?documentid= - if document_id is None: + if not document_id is None: document_id = request.args.get("id") or request.args.get("documentid") try: document_id = int(document_id)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T155452317866Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T155453182960Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.38s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_498"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_498_1" aria-expanded="false" aria-controls="job_list___sub_collapse_498_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_498_1"><button class="btn btn-outline-success"><span class="job_id">498 : Job ID f8208f27711d434c9a7b4ee1fc4e277e</span></button></div></a><div aria-labelledby="job_list___sub_heading_498_1" data-parent="#job_list___sub_accordion_498" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_498_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=583" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (583, 11), end pos: (583, 78)</button></a></pre><pre>operator: core/AddNot, occurrence: 34</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -580,7 +580,7 @@ app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if not document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: return jsonify({"error": "document id required"}), 400 try:</pre></div><div class="alert alert-secondary"><pre class="diff">.......F...F.. [100%] ================================== FAILURES =================================== ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") assert resp.status_code == 200 #Test file is deleted resp_deletion = client.get("/api/get-document/2") &gt; assert resp_deletion.status_code == 404 E assert 400 == 404 E + where 400 = &lt;WrapperTestResponse streamed [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:446: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_delete_document_route - assert 400 == 404 2 failed, 12 passed, 22 warnings in 20.80s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_499"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_499_1" aria-expanded="false" aria-controls="job_list___sub_collapse_499_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_499_1"><button class="btn btn-outline-success"><span class="job_id">499 : Job ID 163c838baa454b44a8e0a4a72c2dfe7a</span></button></div></a><div aria-labelledby="job_list___sub_heading_499_1" data-parent="#job_list___sub_accordion_499" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_499_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=609" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (609, 11), end pos: (609, 18)</button></a></pre><pre>operator: core/AddNot, occurrence: 35</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -606,7 +606,7 @@ ), 503 # DonÔÇÖt leak whether a doc exists for another user - if not row: + if not not row: app.logger.warning( "Document not found or access denied for id=%s", document_id )</pre></div><div class="alert alert-secondary"><pre class="diff">.......F...F.. [100%] ================================== FAILURES =================================== ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") assert resp.status_code == 200 #Test file is deleted &gt; resp_deletion = client.get("/api/get-document/2") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:445: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1162: in get return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ document_id = 2 @app.get("/api/get-document") @app.get("/api/get-document/&lt;int:document_id&gt;") @require_auth def get_document(document_id: int | None = None): # Support both path param and ?id=/ ?documentid= if document_id is None: document_id = request.args.get("id") or request.args.get("documentid") try: document_id = int(document_id) except (TypeError, ValueError): app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: return jsonify({"error": "document id required"}), 400 try: with get_engine().connect() as conn: row = conn.execute( text( """ SELECT id, name, path, HEX(sha256) AS sha256_hex, size FROM Documents WHERE id = :id AND ownerid = :uid LIMIT 1 """ ), {"id": document_id, "uid": int(g.user["id"])}, ).first() except Exception: app.logger.error( f"Database error in get_document: {document_id},{g.user['id']}" ) inc_db_error("get_document") return jsonify( {"error": "An error occurred while fetching the document"} ), 503 # DonÔÇÖt leak whether a doc exists for another user if not not row: app.logger.warning( "Document not found or access denied for id=%s", document_id ) return jsonify({"error": "document not found"}), 404 storage_root = app.config["STORAGE_DIR"].resolve() &gt; file_path = Path(row.path) ^^^^^^^^ E AttributeError: 'NoneType' object has no attribute 'path' server.py:616: AttributeError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_delete_document_route - AttributeError: 'Non... 2 failed, 12 passed, 22 warnings in 20.38s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_500"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_500_1" aria-expanded="false" aria-controls="job_list___sub_collapse_500_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_500_1"><button class="btn btn-outline-success"><span class="job_id">500 : Job ID 9022481ff41541f780de1bed1bfdfe13</span></button></div></a><div aria-labelledby="job_list___sub_heading_500_1" data-parent="#job_list___sub_accordion_500" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_500_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=629" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (629, 11), end pos: (629, 32)</button></a></pre><pre>operator: core/AddNot, occurrence: 36</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -626,7 +626,7 @@ ) return jsonify({"error": "document path invalid"}), 500 - if not resolved.exists(): + if not not resolved.exists(): app.logger.error("File missing on disk for document id=%s", document_id) return jsonify({"error": "file missing on disk"}), 410 </pre></div><div class="alert alert-secondary"><pre class="diff">.......F...... [100%] ================================== FAILURES =================================== ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:630 File missing on disk for document id=1 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_get_document_route - assert False 1 failed, 13 passed, 22 warnings in 20.86s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_501"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_501_1" aria-expanded="false" aria-controls="job_list___sub_collapse_501_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_501_1"><button class="btn btn-outline-success"><span class="job_id">501 : Job ID 2eca742e20454c8a97ad499f04094282</span></button></div></a><div aria-labelledby="job_list___sub_heading_501_1" data-parent="#job_list___sub_accordion_501" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_501_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=643" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (643, 15), end pos: (643, 31)</button></a></pre><pre>operator: core/AddNot, occurrence: 37</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -640,7 +640,7 @@ try: # Quick PDF signature check head = f.read(5) - if head != b"%PDF-": + if not head != b"%PDF-": f.close() app.logger.warning( "Invalid PDF signature for document id=%s", document_id</pre></div><div class="alert alert-secondary"><pre class="diff">.......F...... [100%] ================================== FAILURES =================================== ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:645 Invalid PDF signature for document id=1 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_get_document_route - assert False 1 failed, 13 passed, 22 warnings in 20.47s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_502"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_502_1" aria-expanded="false" aria-controls="job_list___sub_collapse_502_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_502_1"><button class="btn btn-outline-danger"><span class="job_id">502 : Job ID a1b2a54f35a8447484ac2bae9f3d0500</span></button></div></a><div aria-labelledby="job_list___sub_heading_502_1" data-parent="#job_list___sub_accordion_502" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_502_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=654" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (654, 15), end pos: (654, 48)</button></a></pre><pre>operator: core/AddNot, occurrence: 38</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -651,7 +651,7 @@ # Prepare safe filename (preserve existing .pdf if present) name = (row.name or "document").strip().replace("\r", "").replace("\n", "") - if not name.lower().endswith(".pdf"): + if not not name.lower().endswith(".pdf"): name = f"{name}.pdf" # Stat via the same FD to avoid TOCTOU</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.07s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_503"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_503_1" aria-expanded="false" aria-controls="job_list___sub_collapse_503_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_503_1"><button class="btn btn-outline-success"><span class="job_id">503 : Job ID 315be583d0874c008799010e7b6fcb8e</span></button></div></a><div aria-labelledby="job_list___sub_heading_503_1" data-parent="#job_list___sub_accordion_503" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_503_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=671" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (671, 15), end pos: (671, 65)</button></a></pre><pre>operator: core/AddNot, occurrence: 39</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -668,7 +668,7 @@ ) # Strong validator - if isinstance(row.sha256_hex, str) and row.sha256_hex: + if not isinstance(row.sha256_hex, str) and row.sha256_hex: resp.set_etag(row.sha256_hex.lower()) # Headers</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T001341058201Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T001341962369Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.24s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_504"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_504_1" aria-expanded="false" aria-controls="job_list___sub_collapse_504_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_504_1"><button class="btn btn-outline-danger"><span class="job_id">504 : Job ID 052cf0d1853e4062b02836749fdb54e0</span></button></div></a><div aria-labelledby="job_list___sub_heading_504_1" data-parent="#job_list___sub_accordion_504" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_504_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=696" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (696, 11), end pos: (696, 63)</button></a></pre><pre>operator: core/AddNot, occurrence: 40</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -693,7 +693,7 @@ @app.get("/api/get-version/&lt;link&gt;") def get_version(link: str): # Accept both 32-char (RMAP session secrets) and 64-char (SHA-256 style) tokens - if not re.fullmatch(r"[0-9a-f]{32}|[0-9a-f]{64}", link): + if not not re.fullmatch(r"[0-9a-f]{32}|[0-9a-f]{64}", link): app.logger.warning("Invalid version link format: %s", link) return jsonify({"error": "document not found"}), 404 </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.25s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_505"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_505_1" aria-expanded="false" aria-controls="job_list___sub_collapse_505_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_505_1"><button class="btn btn-outline-danger"><span class="job_id">505 : Job ID 1020587fb2674e6581b8c9d9bacda27c</span></button></div></a><div aria-labelledby="job_list___sub_heading_505_1" data-parent="#job_list___sub_accordion_505" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_505_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=718" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (718, 11), end pos: (718, 18)</button></a></pre><pre>operator: core/AddNot, occurrence: 41</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -715,7 +715,7 @@ inc_db_error("get_version") return jsonify({"error": "database error"}), 503 - if not row: + if not not row: app.logger.warning("Version not found for link: %s", link) return jsonify({"error": "document not found"}), 404 </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.13s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_506"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_506_1" aria-expanded="false" aria-controls="job_list___sub_collapse_506_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_506_1"><button class="btn btn-outline-success"><span class="job_id">506 : Job ID d508224198ff44b78b989389f7347121</span></button></div></a><div aria-labelledby="job_list___sub_heading_506_1" data-parent="#job_list___sub_accordion_506" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_506_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=730" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (730, 11), end pos: (730, 32)</button></a></pre><pre>operator: core/AddNot, occurrence: 42</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -727,7 +727,7 @@ ) return jsonify({"error": "document path invalid"}), 500 - if not resolved.exists(): + if not not resolved.exists(): app.logger.error("File missing on disk for version link=%s", link) return jsonify({"error": "file missing on disk"}), 410 </pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T174354348900Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T174355336630Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.34s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_507"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_507_1" aria-expanded="false" aria-controls="job_list___sub_collapse_507_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_507_1"><button class="btn btn-outline-danger"><span class="job_id">507 : Job ID ff8d93063d35451793d6ec07982e7119</span></button></div></a><div aria-labelledby="job_list___sub_heading_507_1" data-parent="#job_list___sub_accordion_507" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_507_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=737" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (737, 19), end pos: (737, 37)</button></a></pre><pre>operator: core/AddNot, occurrence: 43</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -734,7 +734,7 @@ try: with resolved.open("rb") as fh: header = fh.read(5) - if header != b"%PDF-": + if not header != b"%PDF-": app.logger.warning( "Invalid PDF signature for version link=%s", link )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.32s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_508"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_508_1" aria-expanded="false" aria-controls="job_list___sub_collapse_508_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_508_1"><button class="btn btn-outline-success"><span class="job_id">508 : Job ID de27230dd5b84a6c9d218f103b4bdde5</span></button></div></a><div aria-labelledby="job_list___sub_heading_508_1" data-parent="#job_list___sub_accordion_508" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_508_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=752" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (752, 24), end pos: (752, 57)</button></a></pre><pre>operator: core/AddNot, occurrence: 44</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -749,7 +749,7 @@ return jsonify({"error": "error serving file"}), 500 download_name = ( - row.link if row.link.lower().endswith(".pdf") else f"{row.link}.pdf" + row.link if not row.link.lower().endswith(".pdf") else f"{row.link}.pdf" ) safe_download = download_name.replace("\r", "").replace("\n", "") </pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T181430250783Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T181431198463Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.51s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_509"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_509_1" aria-expanded="false" aria-controls="job_list___sub_collapse_509_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_509_1"><button class="btn btn-outline-success"><span class="job_id">509 : Job ID 3db1ffa772134abd835bbff9d20ce251</span></button></div></a><div aria-labelledby="job_list___sub_heading_509_1" data-parent="#job_list___sub_accordion_509" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_509_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=784" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (784, 11), end pos: (784, 31)</button></a></pre><pre>operator: core/AddNot, occurrence: 45</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -781,7 +781,7 @@ def _safe_resolve_under_storage(p: str, storage_root: Path) -&gt; Path: storage_root = storage_root.resolve() fp = Path(p) - if not fp.is_absolute(): + if not not fp.is_absolute(): fp = storage_root / fp fp = fp.resolve() # Python 3.12 has is_relative_to on Path</pre></div><div class="alert alert-secondary"><pre class="diff">...F.......... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:228: in open request = self._request_from_builder_args(args, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:200: in _request_from_builder_args return builder.get_request() ^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:764: in get_request return cls(self.get_environ()) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:688: in get_environ input_stream, content_length, boundary = stream_encode_multipart( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:130: in stream_encode_multipart write_binary(encoder.send_event(Data(data=chunk, more_data=True))) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:81: in write_binary return stream.write(s) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... 1 failed, 13 passed, 22 warnings in 20.67s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_510"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_510_1" aria-expanded="false" aria-controls="job_list___sub_collapse_510_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_510_1"><button class="btn btn-outline-danger"><span class="job_id">510 : Job ID dc6319e7b0d043a4b9d3033e7438d6a9</span></button></div></a><div aria-labelledby="job_list___sub_heading_510_1" data-parent="#job_list___sub_accordion_510" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_510_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=788" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (788, 11), end pos: (788, 40)</button></a></pre><pre>operator: core/AddNot, occurrence: 46</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -785,7 +785,7 @@ fp = storage_root / fp fp = fp.resolve() # Python 3.12 has is_relative_to on Path - if hasattr(fp, "is_relative_to"): + if not hasattr(fp, "is_relative_to"): if not fp.is_relative_to(storage_root): raise RuntimeError(f"path {fp} escapes storage root {storage_root}") else:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.00s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_511"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_511_1" aria-expanded="false" aria-controls="job_list___sub_collapse_511_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_511_1"><button class="btn btn-outline-danger"><span class="job_id">511 : Job ID d1f4bf7e38d74123b9fcbe0601d0b37f</span></button></div></a><div aria-labelledby="job_list___sub_heading_511_1" data-parent="#job_list___sub_accordion_511" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_511_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=789" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (789, 15), end pos: (789, 50)</button></a></pre><pre>operator: core/AddNot, occurrence: 47</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -786,7 +786,7 @@ fp = fp.resolve() # Python 3.12 has is_relative_to on Path if hasattr(fp, "is_relative_to"): - if not fp.is_relative_to(storage_root): + if not not fp.is_relative_to(storage_root): raise RuntimeError(f"path {fp} escapes storage root {storage_root}") else: try:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.32s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_512"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_512_1" aria-expanded="false" aria-controls="job_list___sub_collapse_512_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_512_1"><button class="btn btn-outline-success"><span class="job_id">512 : Job ID 6025aebc6f1b4315b255c6011e5b64e0</span></button></div></a><div aria-labelledby="job_list___sub_heading_512_1" data-parent="#job_list___sub_accordion_512" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_512_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=806" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (806, 11), end pos: (806, 36)</button></a></pre><pre>operator: core/AddNot, occurrence: 48</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -803,7 +803,7 @@ @require_auth def delete_document(document_id: int | None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on POST - if document_id in (None, ""): + if not document_id in (None, ""): document_id = ( request.args.get("id") or request.args.get("documentid")</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse streamed [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:814 Document id required for deletion _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e1ecc8f7d9d354609: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 400 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.64s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_513"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_513_1" aria-expanded="false" aria-controls="job_list___sub_collapse_513_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_513_1"><button class="btn btn-outline-success"><span class="job_id">513 : Job ID ff14c12bb1024bb88e149f7eba8ea2f3</span></button></div></a><div aria-labelledby="job_list___sub_heading_513_1" data-parent="#job_list___sub_accordion_513" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_513_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=813" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (813, 11), end pos: (813, 30)</button></a></pre><pre>operator: core/AddNot, occurrence: 49</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -810,7 +810,7 @@ or (request.is_json and (request.get_json(silent=True) or {}).get("id")) ) - if document_id is None: + if not document_id is None: app.logger.warning("Document id required for deletion") return jsonify({"error": "document id required"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T011457256916Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T011458247966Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse streamed [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:814 Document id required for deletion ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 400 == 200 8 failed, 6 passed, 22 warnings in 19.40s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_514"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_514_1" aria-expanded="false" aria-controls="job_list___sub_collapse_514_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_514_1"><button class="btn btn-outline-success"><span class="job_id">514 : Job ID ae263e8bdc454520b985744a8e9a6513</span></button></div></a><div aria-labelledby="job_list___sub_heading_514_1" data-parent="#job_list___sub_accordion_514" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_514_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=823" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (823, 11), end pos: (823, 45)</button></a></pre><pre>operator: core/AddNot, occurrence: 50</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -820,7 +820,7 @@ app.logger.warning("Invalid document id for deletion: %s", document_id) return jsonify({"error": "document id required"}), 400 - if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: + if not doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: app.logger.warning("Non-positive document id for deletion: %s", doc_id) return jsonify({"error": "document id required"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">...........F.. [100%] ================================== FAILURES =================================== _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse streamed [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:824 Non-positive document id for deletion: 2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_delete_document_route - assert 400 == 200 1 failed, 13 passed, 22 warnings in 20.76s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_515"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_515_1" aria-expanded="false" aria-controls="job_list___sub_collapse_515_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_515_1"><button class="btn btn-outline-success"><span class="job_id">515 : Job ID 7c96e8dc34e04d83a1bcaaf67672ab2b</span></button></div></a><div aria-labelledby="job_list___sub_heading_515_1" data-parent="#job_list___sub_accordion_515" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_515_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=848" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (848, 11), end pos: (848, 18)</button></a></pre><pre>operator: core/AddNot, occurrence: 51</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -845,7 +845,7 @@ inc_db_error("delete_document_select") return jsonify({"error": "database error during delete"}), 503 - if not row: + if not not row: # DonÔÇÖt reveal othersÔÇÖ docsÔÇöjust say not found app.logger.warning( "Document not found or access denied for deletion id=%s", doc_id</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T021910196648Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T021911018089Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 18.96s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_516"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_516_1" aria-expanded="false" aria-controls="job_list___sub_collapse_516_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_516_1"><button class="btn btn-outline-success"><span class="job_id">516 : Job ID 3bad4164a1cc406facb0ceeeecb93fc1</span></button></div></a><div aria-labelledby="job_list___sub_heading_516_1" data-parent="#job_list___sub_accordion_516" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_516_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=862" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (862, 15), end pos: (862, 26)</button></a></pre><pre>operator: core/AddNot, occurrence: 52</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -859,7 +859,7 @@ delete_error = None try: fp = _safe_resolve_under_storage(row.path, storage_root) - if fp.exists(): + if not fp.exists(): try: fp.unlink() file_deleted = True</pre></div><div class="alert alert-secondary"><pre class="diff">...F.......... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:228: in open request = self._request_from_builder_args(args, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:200: in _request_from_builder_args return builder.get_request() ^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:764: in get_request return cls(self.get_environ()) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:688: in get_environ input_stream, content_length, boundary = stream_encode_multipart( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:130: in stream_encode_multipart write_binary(encoder.send_event(Data(data=chunk, more_data=True))) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:90: in write_binary new_stream.write(s) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... 1 failed, 13 passed, 22 warnings in 21.00s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_517"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_517_1" aria-expanded="false" aria-controls="job_list___sub_collapse_517_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_517_1"><button class="btn btn-outline-success"><span class="job_id">517 : Job ID dcc0ccaa00b74dd59c6d0bf2e736ec0b</span></button></div></a><div aria-labelledby="job_list___sub_heading_517_1" data-parent="#job_list___sub_accordion_517" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_517_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=911" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (911, 11), end pos: (911, 26)</button></a></pre><pre>operator: core/AddNot, occurrence: 53</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -908,7 +908,7 @@ @require_auth def create_watermark(document_id: int | None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on GET - if not document_id: + if not not document_id: document_id = ( request.args.get("id") or request.args.get("documentid")</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 42 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:934 Missing document id in request __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e09be400c516ae99f: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 20.33s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_518"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_518_1" aria-expanded="false" aria-controls="job_list___sub_collapse_518_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_518_1"><button class="btn btn-outline-success"><span class="job_id">518 : Job ID 983ee2ad50f34699afa82f1562649261</span></button></div></a><div aria-labelledby="job_list___sub_heading_518_1" data-parent="#job_list___sub_accordion_518" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_518_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=933" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (933, 15), end pos: (933, 29)</button></a></pre><pre>operator: core/AddNot, occurrence: 54</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -930,7 +930,7 @@ # validate input try: - if doc_id is None: + if not doc_id is None: app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id)</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 42 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:934 Missing document id in request __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ecfdb47fb8604bb98: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.76s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_519"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_519_1" aria-expanded="false" aria-controls="job_list___sub_collapse_519_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_519_1"><button class="btn btn-outline-success"><span class="job_id">519 : Job ID dd991165e9854f968d70c6e0846bf2f6</span></button></div></a><div aria-labelledby="job_list___sub_heading_519_1" data-parent="#job_list___sub_accordion_519" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_519_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=937" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (937, 15), end pos: (937, 49)</button></a></pre><pre>operator: core/AddNot, occurrence: 55</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -934,7 +934,7 @@ app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) - if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: + if not doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T010213442695Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 42 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T010214260537Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.24s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_520"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_520_1" aria-expanded="false" aria-controls="job_list___sub_collapse_520_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_520_1"><button class="btn btn-outline-success"><span class="job_id">520 : Job ID b3c7c7a6a6a3459b86433ca13ae53ed9</span></button></div></a><div aria-labelledby="job_list___sub_heading_520_1" data-parent="#job_list___sub_accordion_520" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_520_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=942" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (942, 11), end pos: (947, 9)</button></a></pre><pre>operator: core/AddNot, occurrence: 56</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -939,7 +939,7 @@ except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id) return jsonify({"error": "document_id (int) is required"}), 400 - if ( + if not ( not method or not intended_for or not isinstance(secret, str)</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 63 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:948 Missing required fields for watermarking: {'id': 1, 'intended_for': 'Mickey Mouse', 'key': 'key', 'method': 'robust-xmp', 'position': 'metadata-only', 'secret': 'secret'} ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 1 failed, 13 passed, 22 warnings in 20.00s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_521"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_521_1" aria-expanded="false" aria-controls="job_list___sub_collapse_521_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_521_1"><button class="btn btn-outline-success"><span class="job_id">521 : Job ID 5ed32aaa07ee4c82850d90d75f17c980</span></button></div></a><div aria-labelledby="job_list___sub_heading_521_1" data-parent="#job_list___sub_accordion_521" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_521_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=971" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (971, 11), end pos: (971, 18)</button></a></pre><pre>operator: core/AddNot, occurrence: 57</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -968,7 +968,7 @@ app.logger.error("Database error fetching document %s", e) return jsonify({"error": "database error"}), 503 - if not row: + if not not row: app.logger.warning( "Document not found or access denied for watermarking id=%s", doc_id )</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 1 failed, 13 passed, 22 warnings in 20.10s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_522"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_522_1" aria-expanded="false" aria-controls="job_list___sub_collapse_522_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_522_1"><button class="btn btn-outline-danger"><span class="job_id">522 : Job ID e1bec401fbb04ea78678984a22d8e146</span></button></div></a><div aria-labelledby="job_list___sub_heading_522_1" data-parent="#job_list___sub_accordion_522" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_522_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=980" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (980, 11), end pos: (980, 38)</button></a></pre><pre>operator: core/AddNot, occurrence: 58</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -977,7 +977,7 @@ # resolve path safely under STORAGE_DIR storage_root = Path(app.config["STORAGE_DIR"]).resolve() file_path = Path(row.path) - if not file_path.is_absolute(): + if not not file_path.is_absolute(): file_path = storage_root / file_path file_path = file_path.resolve() try:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.51s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_523"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_523_1" aria-expanded="false" aria-controls="job_list___sub_collapse_523_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_523_1"><button class="btn btn-outline-success"><span class="job_id">523 : Job ID 16200b0d2adf402ca4e2bb3e9ae3a050</span></button></div></a><div aria-labelledby="job_list___sub_heading_523_1" data-parent="#job_list___sub_accordion_523" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_523_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=988" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (988, 11), end pos: (988, 33)</button></a></pre><pre>operator: core/AddNot, occurrence: 59</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -985,7 +985,7 @@ except ValueError: app.logger.warning("Rejected document path for id %s: %s", doc_id, row.path) return jsonify({"error": "document path invalid"}), 500 - if not file_path.exists(): + if not not file_path.exists(): app.logger.error("File missing on disk for document id=%s", doc_id) return jsonify({"error": "file missing on disk"}), 410 </pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T154653527648Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T154654444611Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.29s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_524"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_524_1" aria-expanded="false" aria-controls="job_list___sub_collapse_524_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_524_1"><button class="btn btn-outline-success"><span class="job_id">524 : Job ID 45e7ddd6212545fd82af4d93fd503d0f</span></button></div></a><div aria-labelledby="job_list___sub_heading_524_1" data-parent="#job_list___sub_accordion_524" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_524_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=997" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (997, 15), end pos: (997, 34)</button></a></pre><pre>operator: core/AddNot, occurrence: 60</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -994,7 +994,7 @@ applicable = WMUtils.is_watermarking_applicable( method=method, pdf=str(file_path), position=position ) - if applicable is False: + if not applicable is False: inc_watermark_failed(method, "applicability") app.logger.info( "Watermarking method %s not applicable for document %s",</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T222420750216Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T222421660649Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.68s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_525"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_525_1" aria-expanded="false" aria-controls="job_list___sub_collapse_525_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_525_1"><button class="btn btn-outline-success"><span class="job_id">525 : Job ID 88b218d842884f94887304bafc58de38</span></button></div></a><div aria-labelledby="job_list___sub_heading_525_1" data-parent="#job_list___sub_accordion_525" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_525_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1024" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1024, 15), end pos: (1024, 82)</button></a></pre><pre>operator: core/AddNot, occurrence: 61</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1021,7 +1021,7 @@ position=position, ) observe_watermark_duration(method, time.time() - _wm_start) - if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: + if not not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: inc_watermark_failed(method, "empty_output") app.logger.error( "Watermarking produced no output for document %s using method %s",</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 44 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1026 Watermarking produced no output for document 1 using method robust-xmp ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 1 failed, 13 passed, 22 warnings in 20.36s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_526"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_526_1" aria-expanded="false" aria-controls="job_list___sub_collapse_526_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_526_1"><button class="btn btn-outline-success"><span class="job_id">526 : Job ID ebd5f6adac1c46a9af3c89afb76a3966</span></button></div></a><div aria-labelledby="job_list___sub_heading_526_1" data-parent="#job_list___sub_accordion_526" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_526_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1148" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1148, 11), end pos: (1148, 26)</button></a></pre><pre>operator: core/AddNot, occurrence: 62</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1145,7 +1145,7 @@ @require_auth def read_watermark(document_id: int | None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on POST - if not document_id: + if not not document_id: document_id = ( request.args.get("id") or request.args.get("documentid")</pre></div><div class="alert alert-secondary"><pre class="diff">..........F... [100%] ================================== FAILURES =================================== __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 42 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:400: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:1169 Missing document id in request ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 1 failed, 13 passed, 22 warnings in 19.96s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_527"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_527_1" aria-expanded="false" aria-controls="job_list___sub_collapse_527_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_527_1"><button class="btn btn-outline-success"><span class="job_id">527 : Job ID f7a74e3df9ba483da73e2c2ba568398b</span></button></div></a><div aria-labelledby="job_list___sub_heading_527_1" data-parent="#job_list___sub_accordion_527" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_527_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1168" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1168, 15), end pos: (1168, 29)</button></a></pre><pre>operator: core/AddNot, occurrence: 63</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1165,7 +1165,7 @@ # validate input try: - if doc_id is None: + if not doc_id is None: app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id)</pre></div><div class="alert alert-secondary"><pre class="diff">..........F... [100%] ================================== FAILURES =================================== __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 42 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:400: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:1169 Missing document id in request ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 1 failed, 13 passed, 22 warnings in 20.29s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_528"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_528_1" aria-expanded="false" aria-controls="job_list___sub_collapse_528_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_528_1"><button class="btn btn-outline-success"><span class="job_id">528 : Job ID 5054ef13a1194222a66cd23432b520a5</span></button></div></a><div aria-labelledby="job_list___sub_heading_528_1" data-parent="#job_list___sub_accordion_528" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_528_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1172" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1172, 15), end pos: (1172, 49)</button></a></pre><pre>operator: core/AddNot, occurrence: 64</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1169,7 +1169,7 @@ app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) - if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: + if not doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id)</pre></div><div class="alert alert-secondary"><pre class="diff">..........F... [100%] ================================== FAILURES =================================== __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 42 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:400: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 1 failed, 13 passed, 22 warnings in 20.82s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_529"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_529_1" aria-expanded="false" aria-controls="job_list___sub_collapse_529_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_529_1"><button class="btn btn-outline-success"><span class="job_id">529 : Job ID 63093eaedf5d4b72867a9c7fccf5bde9</span></button></div></a><div aria-labelledby="job_list___sub_heading_529_1" data-parent="#job_list___sub_accordion_529" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_529_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1177" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1177, 11), end pos: (1177, 80)</button></a></pre><pre>operator: core/AddNot, occurrence: 65</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1174,7 +1174,7 @@ except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id) return jsonify({"error": "document_id (int) is required"}), 400 - if not method or not isinstance(method, str) or not isinstance(key, str): + if not not method or not isinstance(method, str) or not isinstance(key, str): app.logger.warning("Missing required fields for watermarking: %s", payload) return jsonify({"error": "method, and key are required"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">..........F... [100%] ================================== FAILURES =================================== __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 41 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:400: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:1178 Missing required fields for watermarking: {'id': 2, 'key': 'strong-password', 'method': 'overlay-watermark', 'position': 'metadata-only'} ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 1 failed, 13 passed, 22 warnings in 19.81s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_530"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_530_1" aria-expanded="false" aria-controls="job_list___sub_collapse_530_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_530_1"><button class="btn btn-outline-success"><span class="job_id">530 : Job ID 144a8bb176fe40378b52081c8a10c08b</span></button></div></a><div aria-labelledby="job_list___sub_heading_530_1" data-parent="#job_list___sub_accordion_530" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_530_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1201" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1201, 11), end pos: (1201, 18)</button></a></pre><pre>operator: core/AddNot, occurrence: 66</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1198,7 +1198,7 @@ ) return jsonify({"error": "database error"}), 503 - if not row: + if not not row: app.logger.warning( "Document not found or access denied for watermark read id=%s", doc_id )</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T045320894755Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T045321911208Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 20.36s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_531"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_531_1" aria-expanded="false" aria-controls="job_list___sub_collapse_531_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_531_1"><button class="btn btn-outline-danger"><span class="job_id">531 : Job ID 198d84c9b54a495487f3fdd38b05b9d7</span></button></div></a><div aria-labelledby="job_list___sub_heading_531_1" data-parent="#job_list___sub_accordion_531" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_531_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1210" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1210, 11), end pos: (1210, 38)</button></a></pre><pre>operator: core/AddNot, occurrence: 67</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1207,7 +1207,7 @@ # resolve path safely under STORAGE_DIR storage_root = Path(app.config["STORAGE_DIR"]).resolve() file_path = Path(row.path) - if not file_path.is_absolute(): + if not not file_path.is_absolute(): file_path = storage_root / file_path file_path = file_path.resolve() try:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.57s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_532"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_532_1" aria-expanded="false" aria-controls="job_list___sub_collapse_532_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_532_1"><button class="btn btn-outline-success"><span class="job_id">532 : Job ID 86ad0bc5f6d34ce9bf969983de046b74</span></button></div></a><div aria-labelledby="job_list___sub_heading_532_1" data-parent="#job_list___sub_accordion_532" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_532_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1218" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1218, 11), end pos: (1218, 33)</button></a></pre><pre>operator: core/AddNot, occurrence: 68</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1215,7 +1215,7 @@ except ValueError: app.logger.warning("Rejected document path for id %s: %s", doc_id, row.path) return jsonify({"error": "document path invalid"}), 500 - if not file_path.exists(): + if not not file_path.exists(): app.logger.error("File missing on disk for document id=%s", doc_id) return jsonify({"error": "file missing on disk"}), 410 </pre></div><div class="alert alert-secondary"><pre class="diff">..........F... [100%] ================================== FAILURES =================================== __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 410 == 201 E + where 410 = &lt;WrapperTestResponse 33 bytes [410 GONE]&gt;.status_code ..\test\test_api.py:400: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1219 File missing on disk for document id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_read_watermark_route - assert 410 == 201 1 failed, 13 passed, 22 warnings in 19.97s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_533"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_533_1" aria-expanded="false" aria-controls="job_list___sub_collapse_533_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_533_1"><button class="btn btn-outline-danger"><span class="job_id">533 : Job ID 47acdd54e54547ce8e669485108beae4</span></button></div></a><div aria-labelledby="job_list___sub_heading_533_1" data-parent="#job_list___sub_accordion_533" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_533_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1243" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1243, 11), end pos: (1243, 37)</button></a></pre><pre>operator: core/AddNot, occurrence: 69</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1240,7 +1240,7 @@ def _is_authorized_metrics_request() -&gt; bool: token_required = os.environ.get("METRICS_TOKEN", "") provided = request.headers.get("X-Metrics-Token", "") - if provided != token_required: + if not provided != token_required: return False return True </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.35s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_534"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_534_1" aria-expanded="false" aria-controls="job_list___sub_collapse_534_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_534_1"><button class="btn btn-outline-success"><span class="job_id">534 : Job ID f6fd67679148428da0dee077fc23323e</span></button></div></a><div aria-labelledby="job_list___sub_heading_534_1" data-parent="#job_list___sub_accordion_534" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_534_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1249" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1249, 11), end pos: (1249, 47)</button></a></pre><pre>operator: core/AddNot, occurrence: 70</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1246,7 +1246,7 @@ @app.get("/metrics") def metrics(): - if not _is_authorized_metrics_request(): + if not not _is_authorized_metrics_request(): # Obscure existence a bit ÔÇô return 404 instead of 403 to casual scans app.logger.warning( "Unauthorized metrics access attempt from %s", request.remote_addr</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T041751675420Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T041752661737Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 20.05s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_535"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_535_1" aria-expanded="false" aria-controls="job_list___sub_collapse_535_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_535_1"><button class="btn btn-outline-success"><span class="job_id">535 : Job ID 108ee367582e4306b3631a8485b96d5a</span></button></div></a><div aria-labelledby="job_list___sub_heading_535_1" data-parent="#job_list___sub_accordion_535" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_535_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1264" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1264, 3), end pos: (1264, 25)</button></a></pre><pre>operator: core/AddNot, occurrence: 71</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1261,7 +1261,7 @@ # WSGI entrypoint app = create_app() -if __name__ == "__main__": +if not __name__ == "__main__": port = int(os.environ.get("PORT", 5000)) # Use localhost by default for security, allow override via environment variable host = os.environ.get("HOST", "127.0.0.1")</pre></div><div class="alert alert-secondary"><pre class="diff">timeout</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_536"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_536_1" aria-expanded="false" aria-controls="job_list___sub_collapse_536_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_536_1"><button class="btn btn-outline-danger"><span class="job_id">536 : Job ID 990becd65bde49e99bdc0a508cd60f24</span></button></div></a><div aria-labelledby="job_list___sub_heading_536_1" data-parent="#job_list___sub_accordion_536" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_536_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=62" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (62, 44), end pos: (62, 48)</button></a></pre><pre>operator: core/ReplaceTrueWithFalse, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -59,7 +59,7 @@ app.config["DB_PORT"] = int(os.environ.get("DB_PORT", "3306")) app.config["DB_NAME"] = os.environ.get("DB_NAME", "tatou") - app.config["STORAGE_DIR"].mkdir(parents=True, exist_ok=True) + app.config["STORAGE_DIR"].mkdir(parents=False, exist_ok=True) app.config["TESTING"] = os.environ.get("TESTING", False) # --- DB engine only (no Table metadata) ---</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.49s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_537"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_537_1" aria-expanded="false" aria-controls="job_list___sub_collapse_537_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_537_1"><button class="btn btn-outline-success"><span class="job_id">537 : Job ID 451174fc33f5497095ba96ce44db0b21</span></button></div></a><div aria-labelledby="job_list___sub_heading_537_1" data-parent="#job_list___sub_accordion_537" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_537_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=62" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (62, 59), end pos: (62, 63)</button></a></pre><pre>operator: core/ReplaceTrueWithFalse, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -59,7 +59,7 @@ app.config["DB_PORT"] = int(os.environ.get("DB_PORT", "3306")) app.config["DB_NAME"] = os.environ.get("DB_NAME", "tatou") - app.config["STORAGE_DIR"].mkdir(parents=True, exist_ok=True) + app.config["STORAGE_DIR"].mkdir(parents=True, exist_ok=False) app.config["TESTING"] = os.environ.get("TESTING", False) # --- DB engine only (no Table metadata) ---</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1262: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:62: in create_app app.config["STORAGE_DIR"].mkdir(parents=True, exist_ok=False) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\pathlib.py:1312: in mkdir os.mkdir(self, mode) E FileExistsError: [WinError 183] Impossibile creare un file, se il file esiste gi%á: 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-17T02:08:10+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T02:08:10+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_db-data Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_user-files Removing Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_db-data Removed Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removed time="2025-10-17T02:08:11+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T02:08:12+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - FileExistsError: [WinError 183] Impossibile crear... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 7 warnings, 1 error in 13.25s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_538"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_538_1" aria-expanded="false" aria-controls="job_list___sub_collapse_538_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_538_1"><button class="btn btn-outline-danger"><span class="job_id">538 : Job ID a9ddb056167b49a5964dfaf0ad7d0db8</span></button></div></a><div aria-labelledby="job_list___sub_heading_538_1" data-parent="#job_list___sub_accordion_538" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_538_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=76" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (76, 60), end pos: (76, 64)</button></a></pre><pre>operator: core/ReplaceTrueWithFalse, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -73,7 +73,7 @@ eng = app.config.get("_ENGINE") if eng is None: try: - eng = create_engine(db_url(), pool_pre_ping=True, future=True) + eng = create_engine(db_url(), pool_pre_ping=False, future=True) except Exception as e: app.logger.critical("Failed to initialize database engine: %s", e) raise</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.12s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_539"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_539_1" aria-expanded="false" aria-controls="job_list___sub_collapse_539_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_539_1"><button class="btn btn-outline-success"><span class="job_id">539 : Job ID dff64e9a8fda4e35a1da223f161a9da0</span></button></div></a><div aria-labelledby="job_list___sub_heading_539_1" data-parent="#job_list___sub_accordion_539" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_539_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=76" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (76, 73), end pos: (76, 77)</button></a></pre><pre>operator: core/ReplaceTrueWithFalse, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -73,7 +73,7 @@ eng = app.config.get("_ENGINE") if eng is None: try: - eng = create_engine(db_url(), pool_pre_ping=True, future=True) + eng = create_engine(db_url(), pool_pre_ping=True, future=False) except Exception as e: app.logger.critical("Failed to initialize database engine: %s", e) raise</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ CRITICAL server:server.py:78 Failed to initialize database engine: The 'future' parameter passed to create_engine() may only be set to True. ERROR server:server.py:236 Database error in create_user: The 'future' parameter passed to create_engine() may only be set to True. ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ CRITICAL server:server.py:78 Failed to initialize database engine: The 'future' parameter passed to create_engine() may only be set to True. ERROR server:server.py:280 Database error in login: The 'future' parameter passed to create_engine() may only be set to True. _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ CRITICAL server:server.py:78 Failed to initialize database engine: The 'future' parameter passed to create_engine() may only be set to True. ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T150148419501Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ CRITICAL server:server.py:78 Failed to initialize database engine: The 'future' parameter passed to create_engine() may only be set to True. ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ CRITICAL server:server.py:78 Failed to initialize database engine: The 'future' parameter passed to create_engine() may only be set to True. ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ CRITICAL server:server.py:78 Failed to initialize database engine: The 'future' parameter passed to create_engine() may only be set to True. ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ CRITICAL server:server.py:78 Failed to initialize database engine: The 'future' parameter passed to create_engine() may only be set to True. ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ CRITICAL server:server.py:78 Failed to initialize database engine: The 'future' parameter passed to create_engine() may only be set to True. ERROR server:server.py:968 Database error fetching document The 'future' parameter passed to create_engine() may only be set to True. __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ CRITICAL server:server.py:78 Failed to initialize database engine: The 'future' parameter passed to create_engine() may only be set to True. ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T150149159267Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ CRITICAL server:server.py:78 Failed to initialize database engine: The 'future' parameter passed to create_engine() may only be set to True. ERROR server:server.py:844 DB delete error for doc id=2: The 'future' parameter passed to create_engine() may only be set to True. _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ CRITICAL server:server.py:78 Failed to initialize database engine: The 'future' parameter passed to create_engine() may only be set to True. ERROR server:server.py:236 Database error in create_user: The 'future' parameter passed to create_engine() may only be set to True. CRITICAL server:server.py:78 Failed to initialize database engine: The 'future' parameter passed to create_engine() may only be set to True. ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 11 failed, 3 passed, 22 warnings in 18.95s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_540"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_540_1" aria-expanded="false" aria-controls="job_list___sub_collapse_540_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_540_1"><button class="btn btn-outline-success"><span class="job_id">540 : Job ID d5c51fe06c234e2bba47a1dce2b7b4c3</span></button></div></a><div aria-labelledby="job_list___sub_heading_540_1" data-parent="#job_list___sub_accordion_540" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_540_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=178" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (178, 20), end pos: (178, 24)</button></a></pre><pre>operator: core/ReplaceTrueWithFalse, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -175,7 +175,7 @@ try: with get_engine().connect() as conn: conn.execute(text("SELECT 1")) - db_ok = True + db_ok = False except Exception: db_ok = False return jsonify(</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e3f9ef1d24dd3c73e: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.59s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_541"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_541_1" aria-expanded="false" aria-controls="job_list___sub_collapse_541_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_541_1"><button class="btn btn-outline-success"><span class="job_id">541 : Job ID 89627e385b8a4160b88aa81012db0b84</span></button></div></a><div aria-labelledby="job_list___sub_heading_541_1" data-parent="#job_list___sub_accordion_541" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_541_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=194" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (194, 15), end pos: (194, 19)</button></a></pre><pre>operator: core/ReplaceTrueWithFalse, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -191,7 +191,7 @@ return False, "Invalid email format" if not re.match(r"^[a-zA-Z0-9_-]{3,64}$", login): return False, "Invalid login format" - return True, "" + return False, "" # POST /api/create-user {email, login, password} @app.post("/api/create-user")</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 13 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:213 User input validation failed: ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T150432771776Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T150433647396Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:213 User input validation failed: ERROR server:rmap_handler.py:245 Failed to add source PDF to database: No users exist to own RMAP base document; create a user first ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 400 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 11 failed, 3 passed, 22 warnings in 19.45s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_542"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_542_1" aria-expanded="false" aria-controls="job_list___sub_collapse_542_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_542_1"><button class="btn btn-outline-danger"><span class="job_id">542 : Job ID 52d45f7d92794b8fbd00960f1fc04c27</span></button></div></a><div aria-labelledby="job_list___sub_heading_542_1" data-parent="#job_list___sub_accordion_542" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_542_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=199" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (199, 42), end pos: (199, 46)</button></a></pre><pre>operator: core/ReplaceTrueWithFalse, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -196,7 +196,7 @@ # POST /api/create-user {email, login, password} @app.post("/api/create-user") def create_user(): - payload = request.get_json(silent=True) or {} + payload = request.get_json(silent=False) or {} email = (payload.get("email") or "").strip().lower() login = (payload.get("login") or "").strip() password = payload.get("password") or ""</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.28s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_543"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_543_1" aria-expanded="false" aria-controls="job_list___sub_collapse_543_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_543_1"><button class="btn btn-outline-danger"><span class="job_id">543 : Job ID a43348ac30bd49b4b87bf5bcc713588b</span></button></div></a><div aria-labelledby="job_list___sub_heading_543_1" data-parent="#job_list___sub_accordion_543" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_543_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=244" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (244, 42), end pos: (244, 46)</button></a></pre><pre>operator: core/ReplaceTrueWithFalse, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -241,7 +241,7 @@ # POST /api/login {login, password} @app.post("/api/login") def login(): - payload = request.get_json(silent=True) or {} + payload = request.get_json(silent=False) or {} email = (payload.get("email") or "").strip() password = payload.get("password") or "" </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.22s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_544"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_544_1" aria-expanded="false" aria-controls="job_list___sub_collapse_544_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_544_1"><button class="btn btn-outline-success"><span class="job_id">544 : Job ID 5df354b9ecdd4fab9ecf048da15e0f2a</span></button></div></a><div aria-labelledby="job_list___sub_heading_544_1" data-parent="#job_list___sub_accordion_544" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_544_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=342" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (342, 31), end pos: (342, 35)</button></a></pre><pre>operator: core/ReplaceTrueWithFalse, occurrence: 8</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -339,7 +339,7 @@ return jsonify({"error": "invalid filename"}), 400 user_dir = app.config["STORAGE_DIR"] / "files" / g.user["login"] - user_dir.mkdir(parents=True, exist_ok=True) + user_dir.mkdir(parents=False, exist_ok=True) ts = dt.datetime.now(dt.UTC).strftime("%Y%m%dT%H%M%S%fZ") final_name = request.form.get("name") or fname</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T184013802261Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T184014765713Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 20.46s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_545"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_545_1" aria-expanded="false" aria-controls="job_list___sub_collapse_545_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_545_1"><button class="btn btn-outline-success"><span class="job_id">545 : Job ID 04138755a0844b66b93a47f375a3dd48</span></button></div></a><div aria-labelledby="job_list___sub_heading_545_1" data-parent="#job_list___sub_accordion_545" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_545_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=342" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (342, 46), end pos: (342, 50)</button></a></pre><pre>operator: core/ReplaceTrueWithFalse, occurrence: 9</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -339,7 +339,7 @@ return jsonify({"error": "invalid filename"}), 400 user_dir = app.config["STORAGE_DIR"] / "files" / g.user["login"] - user_dir.mkdir(parents=True, exist_ok=True) + user_dir.mkdir(parents=True, exist_ok=False) ts = dt.datetime.now(dt.UTC).strftime("%Y%m%dT%H%M%S%fZ") final_name = request.form.get("name") or fname</pre></div><div class="alert alert-secondary"><pre class="diff">...F.F.F.FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } &gt; resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:147: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:342: in upload_document user_dir.mkdir(parents=True, exist_ok=False) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = WindowsPath('C:/Users/franc/Documents/GitHub/softsec-tatou/server/src/storage/files/username') mode = 511, parents = True, exist_ok = False def mkdir(self, mode=0o777, parents=False, exist_ok=False): """ Create a new directory at this given path. """ try: &gt; os.mkdir(self, mode) E FileExistsError: [WinError 183] Impossibile creare un file, se il file esiste gi%á: 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username' C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\pathlib.py:1312: FileExistsError __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } &gt; upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:387: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:342: in upload_document user_dir.mkdir(parents=True, exist_ok=False) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = WindowsPath('C:/Users/franc/Documents/GitHub/softsec-tatou/server/src/storage/files/username') mode = 511, parents = True, exist_ok = False def mkdir(self, mode=0o777, parents=False, exist_ok=False): """ Create a new directory at this given path. """ try: &gt; os.mkdir(self, mode) E FileExistsError: [WinError 183] Impossibile creare un file, se il file esiste gi%á: 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username' C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\pathlib.py:1312: FileExistsError _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - FileExistsError: [Wi... FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - FileExistsError: [Win... FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 6 failed, 8 passed, 22 warnings in 19.89s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_546"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_546_1" aria-expanded="false" aria-controls="job_list___sub_collapse_546_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_546_1"><button class="btn btn-outline-success"><span class="job_id">546 : Job ID 2065317740cc41eaac3331a2dd0c8179</span></button></div></a><div aria-labelledby="job_list___sub_heading_546_1" data-parent="#job_list___sub_accordion_546" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_546_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=392" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (392, 42), end pos: (392, 46)</button></a></pre><pre>operator: core/ReplaceTrueWithFalse, occurrence: 10</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -389,7 +389,7 @@ {"id": did}, ).one() except Exception: - stored_path.unlink(missing_ok=True) + stored_path.unlink(missing_ok=False) app.logger.error( "Database error inserting document path=%s user=%s", stored_path,</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e8e18c6b9f246c844: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.74s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_547"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_547_1" aria-expanded="false" aria-controls="job_list___sub_collapse_547_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_547_1"><button class="btn btn-outline-danger"><span class="job_id">547 : Job ID 4470b97bf5e24cc183798b4942d08fca</span></button></div></a><div aria-labelledby="job_list___sub_heading_547_1" data-parent="#job_list___sub_accordion_547" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_547_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=762" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (762, 28), end pos: (762, 32)</button></a></pre><pre>operator: core/ReplaceTrueWithFalse, occurrence: 11</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -759,7 +759,7 @@ mimetype="application/pdf", as_attachment=False, download_name=safe_download, - conditional=True, + conditional=False, max_age=0, last_modified=last_modified, )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.38s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_548"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_548_1" aria-expanded="false" aria-controls="job_list___sub_collapse_548_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_548_1"><button class="btn btn-outline-danger"><span class="job_id">548 : Job ID 1043f9ad05fb46e1b87f8bbc67e55877</span></button></div></a><div aria-labelledby="job_list___sub_heading_548_1" data-parent="#job_list___sub_accordion_548" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_548_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=810" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (810, 65), end pos: (810, 69)</button></a></pre><pre>operator: core/ReplaceTrueWithFalse, occurrence: 12</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -807,7 +807,7 @@ document_id = ( request.args.get("id") or request.args.get("documentid") - or (request.is_json and (request.get_json(silent=True) or {}).get("id")) + or (request.is_json and (request.get_json(silent=False) or {}).get("id")) ) if document_id is None:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.94s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_549"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_549_1" aria-expanded="false" aria-controls="job_list___sub_collapse_549_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_549_1"><button class="btn btn-outline-danger"><span class="job_id">549 : Job ID 5a1bd2db7dcd4be79e2286ba9c1c9ea4</span></button></div></a><div aria-labelledby="job_list___sub_heading_549_1" data-parent="#job_list___sub_accordion_549" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_549_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=865" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (865, 35), end pos: (865, 39)</button></a></pre><pre>operator: core/ReplaceTrueWithFalse, occurrence: 13</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -862,7 +862,7 @@ if fp.exists(): try: fp.unlink() - file_deleted = True + file_deleted = False except Exception as e: delete_error = f"failed to delete file: {e}" app.logger.warning(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.64s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_550"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_550_1" aria-expanded="false" aria-controls="job_list___sub_collapse_550_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_550_1"><button class="btn btn-outline-danger"><span class="job_id">550 : Job ID 97f7784936624d7298261becf5a55900</span></button></div></a><div aria-labelledby="job_list___sub_heading_550_1" data-parent="#job_list___sub_accordion_550" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_550_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=872" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (872, 31), end pos: (872, 35)</button></a></pre><pre>operator: core/ReplaceTrueWithFalse, occurrence: 14</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -869,7 +869,7 @@ "Failed to delete file %s for doc id=%s: %s", fp, row.id, e ) else: - file_missing = True + file_missing = False except RuntimeError as e: # Path escapes storage root; refuse to touch the file delete_error = str(e)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.28s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_551"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_551_1" aria-expanded="false" aria-controls="job_list___sub_collapse_551_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_551_1"><button class="btn btn-outline-danger"><span class="job_id">551 : Job ID 2c302ffd5ca4494c8219a20b44d12113</span></button></div></a><div aria-labelledby="job_list___sub_heading_551_1" data-parent="#job_list___sub_accordion_551" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_551_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=896" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (896, 27), end pos: (896, 31)</button></a></pre><pre>operator: core/ReplaceTrueWithFalse, occurrence: 15</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -893,7 +893,7 @@ return jsonify( { - "deleted": True, + "deleted": False, "id": doc_id, "file_deleted": file_deleted, "file_missing": file_missing,</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.91s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_552"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_552_1" aria-expanded="false" aria-controls="job_list___sub_collapse_552_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_552_1"><button class="btn btn-outline-danger"><span class="job_id">552 : Job ID 3c28f8615eb04c3aa9c7289f3dc81c5b</span></button></div></a><div aria-labelledby="job_list___sub_heading_552_1" data-parent="#job_list___sub_accordion_552" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_552_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=915" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (915, 65), end pos: (915, 69)</button></a></pre><pre>operator: core/ReplaceTrueWithFalse, occurrence: 16</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -912,7 +912,7 @@ document_id = ( request.args.get("id") or request.args.get("documentid") - or (request.is_json and (request.get_json(silent=True) or {}).get("id")) + or (request.is_json and (request.get_json(silent=False) or {}).get("id")) ) try: doc_id = document_id</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.73s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_553"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_553_1" aria-expanded="false" aria-controls="job_list___sub_collapse_553_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_553_1"><button class="btn btn-outline-danger"><span class="job_id">553 : Job ID 2a75f8273b454463b5501c0e55bb2508</span></button></div></a><div aria-labelledby="job_list___sub_heading_553_1" data-parent="#job_list___sub_accordion_553" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_553_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=923" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (923, 42), end pos: (923, 46)</button></a></pre><pre>operator: core/ReplaceTrueWithFalse, occurrence: 17</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -920,7 +920,7 @@ app.logger.warning("Invalid document id in query: %s", document_id) return jsonify({"error": "document id required"}), 400 - payload = request.get_json(silent=True) or {} + payload = request.get_json(silent=False) or {} # allow a couple of aliases for convenience method = payload.get("method") intended_for = payload.get("intended_for")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.60s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_554"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_554_1" aria-expanded="false" aria-controls="job_list___sub_collapse_554_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_554_1"><button class="btn btn-outline-success"><span class="job_id">554 : Job ID 2ad204e7fe17488f804569d13703b482</span></button></div></a><div aria-labelledby="job_list___sub_heading_554_1" data-parent="#job_list___sub_accordion_554" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_554_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1046" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1046, 31), end pos: (1046, 35)</button></a></pre><pre>operator: core/ReplaceTrueWithFalse, occurrence: 18</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1043,7 +1043,7 @@ base_name = Path(row.name or file_path.name).stem intended_slug = secure_filename(intended_for) dest_dir = file_path.parent / "watermarks" - dest_dir.mkdir(parents=True, exist_ok=True) + dest_dir.mkdir(parents=False, exist_ok=True) candidate = f"{base_name}__{intended_slug}.pdf" dest_path = dest_dir / candidate</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T054005167213Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T054006071617Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.92s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_555"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_555_1" aria-expanded="false" aria-controls="job_list___sub_collapse_555_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_555_1"><button class="btn btn-outline-success"><span class="job_id">555 : Job ID 547e6cb47a914ad495fe96a5cf92cc26</span></button></div></a><div aria-labelledby="job_list___sub_heading_555_1" data-parent="#job_list___sub_accordion_555" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_555_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1046" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1046, 46), end pos: (1046, 50)</button></a></pre><pre>operator: core/ReplaceTrueWithFalse, occurrence: 19</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1043,7 +1043,7 @@ base_name = Path(row.name or file_path.name).stem intended_slug = secure_filename(intended_for) dest_dir = file_path.parent / "watermarks" - dest_dir.mkdir(parents=True, exist_ok=True) + dest_dir.mkdir(parents=True, exist_ok=False) candidate = f"{base_name}__{intended_slug}.pdf" dest_path = dest_dir / candidate</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} &gt; resp = client.post("/api/create-watermark", json=parameters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:317: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:1046: in create_watermark dest_dir.mkdir(parents=True, exist_ok=False) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = WindowsPath('C:/Users/franc/Documents/GitHub/softsec-tatou/server/src/storage/files/username/watermarks') mode = 511, parents = True, exist_ok = False def mkdir(self, mode=0o777, parents=False, exist_ok=False): """ Create a new directory at this given path. """ try: &gt; os.mkdir(self, mode) E FileExistsError: [WinError 183] Impossibile creare un file, se il file esiste gi%á: 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username\\watermarks' C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\pathlib.py:1312: FileExistsError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - FileExistsError: [W... 1 failed, 13 passed, 22 warnings in 21.12s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_556"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_556_1" aria-expanded="false" aria-controls="job_list___sub_collapse_556_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_556_1"><button class="btn btn-outline-danger"><span class="job_id">556 : Job ID 8a5c8f6289d84cd291a1d087fd050f66</span></button></div></a><div aria-labelledby="job_list___sub_heading_556_1" data-parent="#job_list___sub_accordion_556" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_556_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1092" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1092, 44), end pos: (1092, 48)</button></a></pre><pre>operator: core/ReplaceTrueWithFalse, occurrence: 20</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1089,7 +1089,7 @@ except IntegrityError as ie: # This should be very rare due to SHA-256 usage, but handle it just in case try: - dest_path.unlink(missing_ok=True) + dest_path.unlink(missing_ok=False) except Exception as cleanup_error: app.logger.warning( f"Failed to cleanup file {dest_path}: {cleanup_error}"</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.44s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_557"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_557_1" aria-expanded="false" aria-controls="job_list___sub_collapse_557_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_557_1"><button class="btn btn-outline-danger"><span class="job_id">557 : Job ID 3a5b1b228b3a42ceb79b1101fe369e0f</span></button></div></a><div aria-labelledby="job_list___sub_heading_557_1" data-parent="#job_list___sub_accordion_557" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_557_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1104" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1104, 44), end pos: (1104, 48)</button></a></pre><pre>operator: core/ReplaceTrueWithFalse, occurrence: 21</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1101,7 +1101,7 @@ return jsonify({"error": "database error during version insert"}), 503 except Exception: try: - dest_path.unlink(missing_ok=True) + dest_path.unlink(missing_ok=False) except Exception as cleanup_error: app.logger.warning( f"Failed to cleanup file {dest_path}: {cleanup_error}"</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.28s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_558"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_558_1" aria-expanded="false" aria-controls="job_list___sub_collapse_558_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_558_1"><button class="btn btn-outline-success"><span class="job_id">558 : Job ID 0221722d1c7b44d8b99e06d79370f695</span></button></div></a><div aria-labelledby="job_list___sub_heading_558_1" data-parent="#job_list___sub_accordion_558" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_558_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1152" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1152, 65), end pos: (1152, 69)</button></a></pre><pre>operator: core/ReplaceTrueWithFalse, occurrence: 22</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1149,7 +1149,7 @@ document_id = ( request.args.get("id") or request.args.get("documentid") - or (request.is_json and (request.get_json(silent=True) or {}).get("id")) + or (request.is_json and (request.get_json(silent=False) or {}).get("id")) ) try: doc_id = document_id</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T042051681109Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T042052771290Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 20.92s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_559"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_559_1" aria-expanded="false" aria-controls="job_list___sub_collapse_559_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_559_1"><button class="btn btn-outline-success"><span class="job_id">559 : Job ID 32061350553e40e1bab46ec29771fcc5</span></button></div></a><div aria-labelledby="job_list___sub_heading_559_1" data-parent="#job_list___sub_accordion_559" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_559_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1160" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1160, 42), end pos: (1160, 46)</button></a></pre><pre>operator: core/ReplaceTrueWithFalse, occurrence: 23</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1157,7 +1157,7 @@ app.logger.warning("Invalid document id in query: %s", document_id) return jsonify({"error": "document id required"}), 400 - payload = request.get_json(silent=True) or {} + payload = request.get_json(silent=False) or {} # allow a couple of aliases for convenience method = payload.get("method") position = payload.get("position") or None</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....F...F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e9f747ba8534438a8: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 3 failed, 11 passed, 22 warnings in 21.44s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_560"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_560_1" aria-expanded="false" aria-controls="job_list___sub_collapse_560_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_560_1"><button class="btn btn-outline-danger"><span class="job_id">560 : Job ID 793bb7e9b4494d79bb1c08842f7c017e</span></button></div></a><div aria-labelledby="job_list___sub_heading_560_1" data-parent="#job_list___sub_accordion_560" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_560_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1245" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1245, 15), end pos: (1245, 19)</button></a></pre><pre>operator: core/ReplaceTrueWithFalse, occurrence: 24</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1242,7 +1242,7 @@ provided = request.headers.get("X-Metrics-Token", "") if provided != token_required: return False - return True + return False @app.get("/metrics") def metrics():</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.20s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_561"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_561_1" aria-expanded="false" aria-controls="job_list___sub_collapse_561_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_561_1"><button class="btn btn-outline-danger"><span class="job_id">561 : Job ID 3a1b6556e67d49fda477c1b4c26aadc5</span></button></div></a><div aria-labelledby="job_list___sub_heading_561_1" data-parent="#job_list___sub_accordion_561" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_561_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=63" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (63, 54), end pos: (63, 59)</button></a></pre><pre>operator: core/ReplaceFalseWithTrue, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -60,7 +60,7 @@ app.config["DB_NAME"] = os.environ.get("DB_NAME", "tatou") app.config["STORAGE_DIR"].mkdir(parents=True, exist_ok=True) - app.config["TESTING"] = os.environ.get("TESTING", False) + app.config["TESTING"] = os.environ.get("TESTING", True) # --- DB engine only (no Table metadata) --- def db_url() -&gt; str:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.45s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_562"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_562_1" aria-expanded="false" aria-controls="job_list___sub_collapse_562_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_562_1"><button class="btn btn-outline-danger"><span class="job_id">562 : Job ID 2c0d5a7bf98b4351b07313c0b7e59df1</span></button></div></a><div aria-labelledby="job_list___sub_heading_562_1" data-parent="#job_list___sub_accordion_562" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_562_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=180" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (180, 20), end pos: (180, 25)</button></a></pre><pre>operator: core/ReplaceFalseWithTrue, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -177,7 +177,7 @@ conn.execute(text("SELECT 1")) db_ok = True except Exception: - db_ok = False + db_ok = True return jsonify( {"message": "The server is up and running.", "db_connected": db_ok} ), 200</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.07s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_563"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_563_1" aria-expanded="false" aria-controls="job_list___sub_collapse_563_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_563_1"><button class="btn btn-outline-danger"><span class="job_id">563 : Job ID 3729f2b1092e4e719c12ad94bb554c9c</span></button></div></a><div aria-labelledby="job_list___sub_heading_563_1" data-parent="#job_list___sub_accordion_563" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_563_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=189" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (189, 19), end pos: (189, 24)</button></a></pre><pre>operator: core/ReplaceFalseWithTrue, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -186,7 +186,7 @@ def validate_user_input(email: str, login: str) -&gt; tuple[bool, str]: """Validate user input before database operations""" if len(email) &gt; 320 or len(login) &gt; 64: - return False, "Email or login too long" + return True, "Email or login too long" if not re.match(r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$", email): return False, "Invalid email format" if not re.match(r"^[a-zA-Z0-9_-]{3,64}$", login):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.35s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_564"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_564_1" aria-expanded="false" aria-controls="job_list___sub_collapse_564_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_564_1"><button class="btn btn-outline-danger"><span class="job_id">564 : Job ID 147c2fbeebf5473cb5dfe87a2f8349a2</span></button></div></a><div aria-labelledby="job_list___sub_heading_564_1" data-parent="#job_list___sub_accordion_564" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_564_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=191" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (191, 19), end pos: (191, 24)</button></a></pre><pre>operator: core/ReplaceFalseWithTrue, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -188,7 +188,7 @@ if len(email) &gt; 320 or len(login) &gt; 64: return False, "Email or login too long" if not re.match(r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$", email): - return False, "Invalid email format" + return True, "Invalid email format" if not re.match(r"^[a-zA-Z0-9_-]{3,64}$", login): return False, "Invalid login format" return True, ""</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.84s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_565"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_565_1" aria-expanded="false" aria-controls="job_list___sub_collapse_565_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_565_1"><button class="btn btn-outline-success"><span class="job_id">565 : Job ID 532fd786e9444d1aa83b862805c4bb5d</span></button></div></a><div aria-labelledby="job_list___sub_heading_565_1" data-parent="#job_list___sub_accordion_565" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_565_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=193" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (193, 19), end pos: (193, 24)</button></a></pre><pre>operator: core/ReplaceFalseWithTrue, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -190,7 +190,7 @@ if not re.match(r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$", email): return False, "Invalid email format" if not re.match(r"^[a-zA-Z0-9_-]{3,64}$", login): - return False, "Invalid login format" + return True, "Invalid login format" return True, "" # POST /api/create-user {email, login, password}</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e2e68a304639cafc8: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 21.85s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_566"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_566_1" aria-expanded="false" aria-controls="job_list___sub_collapse_566_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_566_1"><button class="btn btn-outline-danger"><span class="job_id">566 : Job ID 15073155348c41c7a6a99b6c1b4e7996</span></button></div></a><div aria-labelledby="job_list___sub_heading_566_1" data-parent="#job_list___sub_accordion_566" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_566_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=268" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (268, 31), end pos: (268, 36)</button></a></pre><pre>operator: core/ReplaceFalseWithTrue, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -265,7 +265,7 @@ is_valid = check_password_hash(row.hpassword, password) else: # Dummy check to maintain constant time - is_valid = False + is_valid = True row = None if not is_valid:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.93s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_567"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_567_1" aria-expanded="false" aria-controls="job_list___sub_collapse_567_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_567_1"><button class="btn btn-outline-danger"><span class="job_id">567 : Job ID 7f1f0cb1068e4ffc89407d1bc838f013</span></button></div></a><div aria-labelledby="job_list___sub_heading_567_1" data-parent="#job_list___sub_accordion_567" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_567_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=663" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (663, 30), end pos: (663, 35)</button></a></pre><pre>operator: core/ReplaceFalseWithTrue, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -660,7 +660,7 @@ resp = send_file( file_path, mimetype="application/pdf", - as_attachment=False, + as_attachment=True, download_name=name, conditional=False, # enables 304 if If-Modified-Since/Range handling max_age=0,</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.56s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_568"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_568_1" aria-expanded="false" aria-controls="job_list___sub_collapse_568_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_568_1"><button class="btn btn-outline-success"><span class="job_id">568 : Job ID 7d44d8d3b78d42f5a774cc6a1a945c46</span></button></div></a><div aria-labelledby="job_list___sub_heading_568_1" data-parent="#job_list___sub_accordion_568" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_568_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=665" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (665, 28), end pos: (665, 33)</button></a></pre><pre>operator: core/ReplaceFalseWithTrue, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -662,7 +662,7 @@ mimetype="application/pdf", as_attachment=False, download_name=name, - conditional=False, # enables 304 if If-Modified-Since/Range handling + conditional=True, # enables 304 if If-Modified-Since/Range handling max_age=0, last_modified=st.st_mtime, )</pre></div><div class="alert alert-secondary"><pre class="diff">...F.......... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... 1 failed, 13 passed, 22 warnings in 20.47s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_569"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_569_1" aria-expanded="false" aria-controls="job_list___sub_collapse_569_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_569_1"><button class="btn btn-outline-danger"><span class="job_id">569 : Job ID b0b30c5485514d31bc0137171ce00eeb</span></button></div></a><div aria-labelledby="job_list___sub_heading_569_1" data-parent="#job_list___sub_accordion_569" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_569_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=760" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (760, 30), end pos: (760, 35)</button></a></pre><pre>operator: core/ReplaceFalseWithTrue, occurrence: 8</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -757,7 +757,7 @@ resp = send_file( resolved, mimetype="application/pdf", - as_attachment=False, + as_attachment=True, download_name=safe_download, conditional=True, max_age=0,</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.19s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_570"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_570_1" aria-expanded="false" aria-controls="job_list___sub_collapse_570_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_570_1"><button class="btn btn-outline-success"><span class="job_id">570 : Job ID 45354205a4454b1baf72577d6aa90cb5</span></button></div></a><div aria-labelledby="job_list___sub_heading_570_1" data-parent="#job_list___sub_accordion_570" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_570_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=857" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (857, 23), end pos: (857, 28)</button></a></pre><pre>operator: core/ReplaceFalseWithTrue, occurrence: 9</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -854,7 +854,7 @@ # Resolve and delete file (best effort) storage_root = Path(app.config["STORAGE_DIR"]) - file_deleted = False + file_deleted = True file_missing = False delete_error = None try:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T212327125482Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T212328074291Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 20.25s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_571"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_571_1" aria-expanded="false" aria-controls="job_list___sub_collapse_571_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_571_1"><button class="btn btn-outline-danger"><span class="job_id">571 : Job ID 1650f9085a714d3fac0cb7180fa78bf0</span></button></div></a><div aria-labelledby="job_list___sub_heading_571_1" data-parent="#job_list___sub_accordion_571" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_571_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=858" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (858, 23), end pos: (858, 28)</button></a></pre><pre>operator: core/ReplaceFalseWithTrue, occurrence: 10</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -855,7 +855,7 @@ # Resolve and delete file (best effort) storage_root = Path(app.config["STORAGE_DIR"]) file_deleted = False - file_missing = False + file_missing = True delete_error = None try: fp = _safe_resolve_under_storage(row.path, storage_root)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 22.37s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_572"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_572_1" aria-expanded="false" aria-controls="job_list___sub_collapse_572_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_572_1"><button class="btn btn-outline-success"><span class="job_id">572 : Job ID ac31b406475346b3ac1e303f0c95be9b</span></button></div></a><div aria-labelledby="job_list___sub_heading_572_1" data-parent="#job_list___sub_accordion_572" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_572_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=997" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (997, 29), end pos: (997, 34)</button></a></pre><pre>operator: core/ReplaceFalseWithTrue, occurrence: 11</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -994,7 +994,7 @@ applicable = WMUtils.is_watermarking_applicable( method=method, pdf=str(file_path), position=position ) - if applicable is False: + if applicable is True: inc_watermark_failed(method, "applicability") app.logger.info( "Watermarking method %s not applicable for document %s",</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 47 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 1 failed, 13 passed, 22 warnings in 22.13s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_573"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_573_1" aria-expanded="false" aria-controls="job_list___sub_collapse_573_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_573_1"><button class="btn btn-outline-danger"><span class="job_id">573 : Job ID f5783b51ca174cd287e45f8a8ca73dec</span></button></div></a><div aria-labelledby="job_list___sub_heading_573_1" data-parent="#job_list___sub_accordion_573" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_573_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1244" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1244, 19), end pos: (1244, 24)</button></a></pre><pre>operator: core/ReplaceFalseWithTrue, occurrence: 12</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1241,7 +1241,7 @@ token_required = os.environ.get("METRICS_TOKEN", "") provided = request.headers.get("X-Metrics-Token", "") if provided != token_required: - return False + return True return True @app.get("/metrics")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.22s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_574"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_574_1" aria-expanded="false" aria-controls="job_list___sub_collapse_574_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_574_1"><button class="btn btn-outline-danger"><span class="job_id">574 : Job ID 043328a91a6a42b780176c92eb2b82bd</span></button></div></a><div aria-labelledby="job_list___sub_heading_574_1" data-parent="#job_list___sub_accordion_574" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_574_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=314" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (314, 31), end pos: (314, 34)</button></a></pre><pre>operator: core/ReplaceAndWithOr, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -311,7 +311,7 @@ start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB - if file.content_length and file.content_length &gt; MAX_FILE_SIZE: + if file.content_length or file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.27s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_575"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_575_1" aria-expanded="false" aria-controls="job_list___sub_collapse_575_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_575_1"><button class="btn btn-outline-success"><span class="job_id">575 : Job ID b036849328f445a1b288856f5af155b8</span></button></div></a><div aria-labelledby="job_list___sub_heading_575_1" data-parent="#job_list___sub_accordion_575" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_575_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=671" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (671, 47), end pos: (671, 50)</button></a></pre><pre>operator: core/ReplaceAndWithOr, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -668,7 +668,7 @@ ) # Strong validator - if isinstance(row.sha256_hex, str) and row.sha256_hex: + if isinstance(row.sha256_hex, str) or row.sha256_hex: resp.set_etag(row.sha256_hex.lower()) # Headers</pre></div><div class="alert alert-secondary"><pre class="diff">...F.......... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:228: in open request = self._request_from_builder_args(args, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:200: in _request_from_builder_args return builder.get_request() ^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:764: in get_request return cls(self.get_environ()) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:688: in get_environ input_stream, content_length, boundary = stream_encode_multipart( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:130: in stream_encode_multipart write_binary(encoder.send_event(Data(data=chunk, more_data=True))) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:81: in write_binary return stream.write(s) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... 1 failed, 13 passed, 22 warnings in 21.00s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_576"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_576_1" aria-expanded="false" aria-controls="job_list___sub_collapse_576_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_576_1"><button class="btn btn-outline-success"><span class="job_id">576 : Job ID 9b392ffa3b7c42f89d07361ac997daa3</span></button></div></a><div aria-labelledby="job_list___sub_heading_576_1" data-parent="#job_list___sub_accordion_576" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_576_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=810" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (810, 36), end pos: (810, 39)</button></a></pre><pre>operator: core/ReplaceAndWithOr, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -807,7 +807,7 @@ document_id = ( request.args.get("id") or request.args.get("documentid") - or (request.is_json and (request.get_json(silent=True) or {}).get("id")) + or (request.is_json or (request.get_json(silent=True) or {}).get("id")) ) if document_id is None:</pre></div><div class="alert alert-secondary"><pre class="diff">...........F.. [100%] ================================== FAILURES =================================== _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") assert resp.status_code == 200 #Test file is deleted resp_deletion = client.get("/api/get-document/2") &gt; assert resp_deletion.status_code == 404 E assert 200 == 404 E + where 200 = &lt;WrapperTestResponse streamed [200 OK]&gt;.status_code ..\test\test_api.py:446: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_delete_document_route - assert 200 == 404 1 failed, 13 passed, 22 warnings in 20.29s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_577"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_577_1" aria-expanded="false" aria-controls="job_list___sub_collapse_577_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_577_1"><button class="btn btn-outline-success"><span class="job_id">577 : Job ID 8ade9d61a6524eeba0b7220c50be5e2b</span></button></div></a><div aria-labelledby="job_list___sub_heading_577_1" data-parent="#job_list___sub_accordion_577" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_577_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=915" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (915, 36), end pos: (915, 39)</button></a></pre><pre>operator: core/ReplaceAndWithOr, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -912,7 +912,7 @@ document_id = ( request.args.get("id") or request.args.get("documentid") - or (request.is_json and (request.get_json(silent=True) or {}).get("id")) + or (request.is_json or (request.get_json(silent=True) or {}).get("id")) ) try: doc_id = document_id</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T171115360876Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T171116245634Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.39s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_578"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_578_1" aria-expanded="false" aria-controls="job_list___sub_collapse_578_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_578_1"><button class="btn btn-outline-success"><span class="job_id">578 : Job ID b538e08a7ccd493d9796a93e93e50bff</span></button></div></a><div aria-labelledby="job_list___sub_heading_578_1" data-parent="#job_list___sub_accordion_578" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_578_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1152" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1152, 36), end pos: (1152, 39)</button></a></pre><pre>operator: core/ReplaceAndWithOr, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1149,7 +1149,7 @@ document_id = ( request.args.get("id") or request.args.get("documentid") - or (request.is_json and (request.get_json(silent=True) or {}).get("id")) + or (request.is_json or (request.get_json(silent=True) or {}).get("id")) ) try: doc_id = document_id</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T153448399637Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T153449329253Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.28s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_579"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_579_1" aria-expanded="false" aria-controls="job_list___sub_collapse_579_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_579_1"><button class="btn btn-outline-success"><span class="job_id">579 : Job ID 9df5a582fbd94ddaae4867bd1b55fe20</span></button></div></a><div aria-labelledby="job_list___sub_heading_579_1" data-parent="#job_list___sub_accordion_579" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_579_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=188" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (188, 28), end pos: (188, 30)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -185,7 +185,7 @@ # Extra backend validation for user input def validate_user_input(email: str, login: str) -&gt; tuple[bool, str]: """Validate user input before database operations""" - if len(email) &gt; 320 or len(login) &gt; 64: + if len(email) &gt; 320 and len(login) &gt; 64: return False, "Email or login too long" if not re.match(r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$", email): return False, "Invalid email format"</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T041021045964Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T041021975581Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.74s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_580"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_580_1" aria-expanded="false" aria-controls="job_list___sub_collapse_580_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_580_1"><button class="btn btn-outline-success"><span class="job_id">580 : Job ID 77dec173516a49f4aaf3a1b99d825f97</span></button></div></a><div aria-labelledby="job_list___sub_heading_580_1" data-parent="#job_list___sub_accordion_580" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_580_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=199" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (199, 48), end pos: (199, 50)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -196,7 +196,7 @@ # POST /api/create-user {email, login, password} @app.post("/api/create-user") def create_user(): - payload = request.get_json(silent=True) or {} + payload = request.get_json(silent=True) and {} email = (payload.get("email") or "").strip().lower() login = (payload.get("login") or "").strip() password = payload.get("password") or ""</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 52 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:205 Missing fields in user creation: {} ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T033954314842Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T033955277621Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:205 Missing fields in user creation: {} ERROR server:rmap_handler.py:245 Failed to add source PDF to database: No users exist to own RMAP base document; create a user first ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 400 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 9 failed, 5 passed, 22 warnings in 19.97s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_581"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_581_1" aria-expanded="false" aria-controls="job_list___sub_collapse_581_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_581_1"><button class="btn btn-outline-success"><span class="job_id">581 : Job ID 2d54f3fd384d43a785402a3ce679977f</span></button></div></a><div aria-labelledby="job_list___sub_heading_581_1" data-parent="#job_list___sub_accordion_581" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_581_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=200" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (200, 38), end pos: (200, 40)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -197,7 +197,7 @@ @app.post("/api/create-user") def create_user(): payload = request.get_json(silent=True) or {} - email = (payload.get("email") or "").strip().lower() + email = (payload.get("email") and "").strip().lower() login = (payload.get("login") or "").strip() password = payload.get("password") or "" start_db = time.time()</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 52 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:205 Missing fields in user creation: {'email': 'user@email.se', 'login': 'username', 'password': 'password'} ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T185234343691Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T185235254606Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:205 Missing fields in user creation: {'email': 'service@rmap.su', 'login': 'rmap_service', 'password': 'password_rmap'} ERROR server:rmap_handler.py:245 Failed to add source PDF to database: No users exist to own RMAP base document; create a user first ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 400 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 11 failed, 3 passed, 22 warnings in 19.60s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_582"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_582_1" aria-expanded="false" aria-controls="job_list___sub_collapse_582_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_582_1"><button class="btn btn-outline-success"><span class="job_id">582 : Job ID 878ae64c386941188bd04d593ee33826</span></button></div></a><div aria-labelledby="job_list___sub_heading_582_1" data-parent="#job_list___sub_accordion_582" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_582_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=201" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (201, 38), end pos: (201, 40)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -198,7 +198,7 @@ def create_user(): payload = request.get_json(silent=True) or {} email = (payload.get("email") or "").strip().lower() - login = (payload.get("login") or "").strip() + login = (payload.get("login") and "").strip() password = payload.get("password") or "" start_db = time.time() if not email or not login or not password:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 52 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:205 Missing fields in user creation: {'email': 'user@email.se', 'login': 'username', 'password': 'password'} ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T210736552917Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T210737549352Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:205 Missing fields in user creation: {'email': 'service@rmap.su', 'login': 'rmap_service', 'password': 'password_rmap'} ERROR server:rmap_handler.py:245 Failed to add source PDF to database: No users exist to own RMAP base document; create a user first ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 400 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 11 failed, 3 passed, 22 warnings in 21.39s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_583"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_583_1" aria-expanded="false" aria-controls="job_list___sub_collapse_583_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_583_1"><button class="btn btn-outline-success"><span class="job_id">583 : Job ID c4b7e175902b485bb6cf6f27312189ca</span></button></div></a><div aria-labelledby="job_list___sub_heading_583_1" data-parent="#job_list___sub_accordion_583" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_583_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=202" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (202, 43), end pos: (202, 45)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -199,7 +199,7 @@ payload = request.get_json(silent=True) or {} email = (payload.get("email") or "").strip().lower() login = (payload.get("login") or "").strip() - password = payload.get("password") or "" + password = payload.get("password") and "" start_db = time.time() if not email or not login or not password: app.logger.warning("Missing fields in user creation: %s", payload)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 52 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:205 Missing fields in user creation: {'email': 'user@email.se', 'login': 'username', 'password': 'password'} ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T161041580531Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T161042536521Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:205 Missing fields in user creation: {'email': 'service@rmap.su', 'login': 'rmap_service', 'password': 'password_rmap'} ERROR server:rmap_handler.py:245 Failed to add source PDF to database: No users exist to own RMAP base document; create a user first ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 400 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 9 failed, 5 passed, 22 warnings in 19.12s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_584"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_584_1" aria-expanded="false" aria-controls="job_list___sub_collapse_584_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_584_1"><button class="btn btn-outline-danger"><span class="job_id">584 : Job ID 6fee1f3875bf465f98ae4bb554e4b3df</span></button></div></a><div aria-labelledby="job_list___sub_heading_584_1" data-parent="#job_list___sub_accordion_584" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_584_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=204" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (204, 21), end pos: (204, 23)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -201,7 +201,7 @@ login = (payload.get("login") or "").strip() password = payload.get("password") or "" start_db = time.time() - if not email or not login or not password: + if not email and not login or not password: app.logger.warning("Missing fields in user creation: %s", payload) return jsonify({"error": "email, login, and password are required"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.39s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_585"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_585_1" aria-expanded="false" aria-controls="job_list___sub_collapse_585_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_585_1"><button class="btn btn-outline-success"><span class="job_id">585 : Job ID 9606d528739447a3beeb19e7418a175f</span></button></div></a><div aria-labelledby="job_list___sub_heading_585_1" data-parent="#job_list___sub_accordion_585" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_585_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=204" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (204, 34), end pos: (204, 36)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -201,7 +201,7 @@ login = (payload.get("login") or "").strip() password = payload.get("password") or "" start_db = time.time() - if not email or not login or not password: + if not email or not login and not password: app.logger.warning("Missing fields in user creation: %s", payload) return jsonify({"error": "email, login, and password are required"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">.F.F.....FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests assert resp.status_code == 201 # Endpoint should exist assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) assert isinstance(resp_data.get("login"), str) assert isinstance(resp_data.get("email"), str) #check values are what we submitted assert resp_data.get("login") == parameters["login"] assert resp_data.get("email") == parameters["email"] #Test with missing parameters # Missing email resp = client.post("/api/create-user",json={ "login": "username", "password": "password", }, # pragma: allowlist secret ) assert resp.status_code == 400 # Missing login resp = client.post("/api/create-user", json={"email": "user@email.se", "password": "password"}, ) assert resp.status_code == 400 # Missing password resp = client.post( "/api/create-user", json={"email": "user@email.se", "login": "username"} ) &gt; assert resp.status_code == 400 E assert 409 == 400 E + where 409 = &lt;WrapperTestResponse streamed [409 CONFLICT]&gt;.status_code ..\test\test_api.py:102: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:205 Missing fields in user creation: {'login': 'username', 'password': 'password'} WARNING server:server.py:213 User input validation failed: Invalid login format WARNING server:server.py:231 Attempt to create duplicate user: email=user@email.se, login=username _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e0f6eff102ee31692: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 409 == 400 FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 6 failed, 8 passed, 22 warnings in 19.92s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_586"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_586_1" aria-expanded="false" aria-controls="job_list___sub_collapse_586_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_586_1"><button class="btn btn-outline-success"><span class="job_id">586 : Job ID 0aff074986b94bf8b65f5a4a1e5f8737</span></button></div></a><div aria-labelledby="job_list___sub_heading_586_1" data-parent="#job_list___sub_accordion_586" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_586_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=244" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (244, 48), end pos: (244, 50)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -241,7 +241,7 @@ # POST /api/login {login, password} @app.post("/api/login") def login(): - payload = request.get_json(silent=True) or {} + payload = request.get_json(silent=True) and {} email = (payload.get("email") or "").strip() password = payload.get("password") or "" </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse 44 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:249 Missing fields in login attempt: {} _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T061509912780Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T061510838137Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 400 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 20.12s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_587"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_587_1" aria-expanded="false" aria-controls="job_list___sub_collapse_587_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_587_1"><button class="btn btn-outline-success"><span class="job_id">587 : Job ID 13eb0329a7c74c02a7379e3f754e9e46</span></button></div></a><div aria-labelledby="job_list___sub_heading_587_1" data-parent="#job_list___sub_accordion_587" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_587_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=245" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (245, 38), end pos: (245, 40)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 8</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -242,7 +242,7 @@ @app.post("/api/login") def login(): payload = request.get_json(silent=True) or {} - email = (payload.get("email") or "").strip() + email = (payload.get("email") and "").strip() password = payload.get("password") or "" if not email or not password:</pre></div><div class="alert alert-secondary"><pre class="diff">..F........... [100%] ================================== FAILURES =================================== ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse 44 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:249 Missing fields in login attempt: {'email': 'user@email.se', 'password': 'password'} ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_login_route - assert 400 == 200 1 failed, 13 passed, 22 warnings in 20.27s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_588"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_588_1" aria-expanded="false" aria-controls="job_list___sub_collapse_588_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_588_1"><button class="btn btn-outline-success"><span class="job_id">588 : Job ID 9e2c0f2d048445a894a2a8664f7132de</span></button></div></a><div aria-labelledby="job_list___sub_heading_588_1" data-parent="#job_list___sub_accordion_588" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_588_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=246" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (246, 43), end pos: (246, 45)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 9</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -243,7 +243,7 @@ def login(): payload = request.get_json(silent=True) or {} email = (payload.get("email") or "").strip() - password = payload.get("password") or "" + password = payload.get("password") and "" if not email or not password: app.logger.warning("Missing fields in login attempt: %s", payload)</pre></div><div class="alert alert-secondary"><pre class="diff">..F........... [100%] ================================== FAILURES =================================== ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse 44 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:249 Missing fields in login attempt: {'email': 'user@email.se', 'password': 'password'} ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_login_route - assert 400 == 200 1 failed, 13 passed, 22 warnings in 20.12s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_589"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_589_1" aria-expanded="false" aria-controls="job_list___sub_collapse_589_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_589_1"><button class="btn btn-outline-success"><span class="job_id">589 : Job ID 505f3d7ce7ee4866b534d34aefdd5212</span></button></div></a><div aria-labelledby="job_list___sub_heading_589_1" data-parent="#job_list___sub_accordion_589" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_589_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=248" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (248, 21), end pos: (248, 23)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 10</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -245,7 +245,7 @@ email = (payload.get("email") or "").strip() password = payload.get("password") or "" - if not email or not password: + if not email and not password: app.logger.warning("Missing fields in login attempt: %s", payload) return jsonify({"error": "email and password are required"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T234854386391Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T234855322823Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.44s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_590"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_590_1" aria-expanded="false" aria-controls="job_list___sub_collapse_590_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_590_1"><button class="btn btn-outline-success"><span class="job_id">590 : Job ID 9013d413dc11456695fe59903745d2a6</span></button></div></a><div aria-labelledby="job_list___sub_heading_590_1" data-parent="#job_list___sub_accordion_590" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_590_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=307" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (307, 20), end pos: (307, 22)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 11</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -304,7 +304,7 @@ return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] - if not file or file.filename == "": + if not file and file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T034629918034Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T034630952304Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 20.63s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_591"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_591_1" aria-expanded="false" aria-controls="job_list___sub_collapse_591_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_591_1"><button class="btn btn-outline-success"><span class="job_id">591 : Job ID 6bb39ce6156f4e4aa8a659db92b3406d</span></button></div></a><div aria-labelledby="job_list___sub_heading_591_1" data-parent="#job_list___sub_accordion_591" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_591_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=345" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (345, 46), end pos: (345, 48)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 12</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -342,7 +342,7 @@ user_dir.mkdir(parents=True, exist_ok=True) ts = dt.datetime.now(dt.UTC).strftime("%Y%m%dT%H%M%S%fZ") - final_name = request.form.get("name") or fname + final_name = request.form.get("name") and fname stored_name = f"{ts}__{fname}" try:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T201807093657Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T201808231387Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 20.71s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_592"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_592_1" aria-expanded="false" aria-controls="job_list___sub_collapse_592_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_592_1"><button class="btn btn-outline-success"><span class="job_id">592 : Job ID d1024cd40f8a44dfa01890a9442ca47c</span></button></div></a><div aria-labelledby="job_list___sub_heading_592_1" data-parent="#job_list___sub_accordion_592" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_592_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=459" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (459, 49), end pos: (459, 51)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 13</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -456,7 +456,7 @@ def list_versions(document_id: int | None = None): # Input validation if document_id is None: - document_id = request.args.get("id") or request.args.get("documentid") + document_id = request.args.get("id") and request.args.get("documentid") try: document_id = int(document_id) if document_id else None if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT:</pre></div><div class="alert alert-secondary"><pre class="diff">.....F........ [100%] ================================== FAILURES =================================== __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse 33 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:463 Invalid document id in query ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_list_versions_route - assert 400 == 200 1 failed, 13 passed, 22 warnings in 20.24s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_593"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_593_1" aria-expanded="false" aria-controls="job_list___sub_collapse_593_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_593_1"><button class="btn btn-outline-danger"><span class="job_id">593 : Job ID 46bbc9af6ec8443f8660dd6318b25e98</span></button></div></a><div aria-labelledby="job_list___sub_heading_593_1" data-parent="#job_list___sub_accordion_593" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_593_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=462" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (462, 39), end pos: (462, 41)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 14</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -459,7 +459,7 @@ document_id = request.args.get("id") or request.args.get("documentid") try: document_id = int(document_id) if document_id else None - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is None and document_id &lt;= 0 or document_id &gt; MAX_DB_INT: app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 except (TypeError, ValueError):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.36s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_594"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_594_1" aria-expanded="false" aria-controls="job_list___sub_collapse_594_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_594_1"><button class="btn btn-outline-success"><span class="job_id">594 : Job ID df0a5b6e123d4fce9a50fd5bba62a71f</span></button></div></a><div aria-labelledby="job_list___sub_heading_594_1" data-parent="#job_list___sub_accordion_594" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_594_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=462" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (462, 59), end pos: (462, 61)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 15</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -459,7 +459,7 @@ document_id = request.args.get("id") or request.args.get("documentid") try: document_id = int(document_id) if document_id else None - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is None or document_id &lt;= 0 and document_id &gt; MAX_DB_INT: app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 except (TypeError, ValueError):</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T225443509858Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T225444475161Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 20.21s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_595"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_595_1" aria-expanded="false" aria-controls="job_list___sub_collapse_595_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_595_1"><button class="btn btn-outline-danger"><span class="job_id">595 : Job ID a17579c729c7478ca1a519b34636db8e</span></button></div></a><div aria-labelledby="job_list___sub_heading_595_1" data-parent="#job_list___sub_accordion_595" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_595_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=469" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (469, 31), end pos: (469, 33)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 16</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -466,7 +466,7 @@ app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is None and document_id &lt;= 0 or document_id &gt; MAX_DB_INT: return jsonify({"error": "document id required"}), 400 try:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.93s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_596"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_596_1" aria-expanded="false" aria-controls="job_list___sub_collapse_596_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_596_1"><button class="btn btn-outline-success"><span class="job_id">596 : Job ID 08edf5426e9844e1a59eb6bb67ad4b42</span></button></div></a><div aria-labelledby="job_list___sub_heading_596_1" data-parent="#job_list___sub_accordion_596" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_596_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=469" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (469, 51), end pos: (469, 53)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 17</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -466,7 +466,7 @@ app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is None or document_id &lt;= 0 and document_id &gt; MAX_DB_INT: return jsonify({"error": "document id required"}), 400 try:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T031006552374Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T031007448680Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.25s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_597"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_597_1" aria-expanded="false" aria-controls="job_list___sub_collapse_597_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_597_1"><button class="btn btn-outline-success"><span class="job_id">597 : Job ID c859827441cd462797382d28b16f3f0e</span></button></div></a><div aria-labelledby="job_list___sub_heading_597_1" data-parent="#job_list___sub_accordion_597" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_597_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=529" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (529, 26), end pos: (529, 28)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 18</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -526,7 +526,7 @@ def list_all_versions(): try: # Validate user data from auth token - if not g.user or not g.user.get("id"): + if not g.user and not g.user.get("id"): app.logger.error("Missing user info in auth token") return jsonify({"error": "Invalid authentication"}), 401 </pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T173829078015Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T173830022621Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.39s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_598"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_598_1" aria-expanded="false" aria-controls="job_list___sub_collapse_598_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_598_1"><button class="btn btn-outline-success"><span class="job_id">598 : Job ID d1bd761b63f541e5b47729bbd5f27a0a</span></button></div></a><div aria-labelledby="job_list___sub_heading_598_1" data-parent="#job_list___sub_accordion_598" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_598_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=576" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (576, 49), end pos: (576, 51)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 19</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -573,7 +573,7 @@ def get_document(document_id: int | None = None): # Support both path param and ?id=/ ?documentid= if document_id is None: - document_id = request.args.get("id") or request.args.get("documentid") + document_id = request.args.get("id") and request.args.get("documentid") try: document_id = int(document_id) except (TypeError, ValueError):</pre></div><div class="alert alert-secondary"><pre class="diff">.......F...... [100%] ================================== FAILURES =================================== ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:580 Invalid document id in query ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_get_document_route - assert False 1 failed, 13 passed, 22 warnings in 20.54s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_599"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_599_1" aria-expanded="false" aria-controls="job_list___sub_collapse_599_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_599_1"><button class="btn btn-outline-danger"><span class="job_id">599 : Job ID 86daadaf81d441cf83d3ba18392ffb75</span></button></div></a><div aria-labelledby="job_list___sub_heading_599_1" data-parent="#job_list___sub_accordion_599" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_599_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=583" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (583, 31), end pos: (583, 33)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 20</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -580,7 +580,7 @@ app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is None and document_id &lt;= 0 or document_id &gt; MAX_DB_INT: return jsonify({"error": "document id required"}), 400 try:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.92s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_600"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_600_1" aria-expanded="false" aria-controls="job_list___sub_collapse_600_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_600_1"><button class="btn btn-outline-danger"><span class="job_id">600 : Job ID 8c23edb0d445484db0644d7f0fe6f49e</span></button></div></a><div aria-labelledby="job_list___sub_heading_600_1" data-parent="#job_list___sub_accordion_600" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_600_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=583" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (583, 51), end pos: (583, 53)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 21</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -580,7 +580,7 @@ app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is None or document_id &lt;= 0 and document_id &gt; MAX_DB_INT: return jsonify({"error": "document id required"}), 400 try:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.12s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_601"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_601_1" aria-expanded="false" aria-controls="job_list___sub_collapse_601_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_601_1"><button class="btn btn-outline-danger"><span class="job_id">601 : Job ID f6ebfb3d415d4ca7ad0204fe7946ecd5</span></button></div></a><div aria-labelledby="job_list___sub_heading_601_1" data-parent="#job_list___sub_accordion_601" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_601_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=653" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (653, 29), end pos: (653, 31)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 22</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -650,7 +650,7 @@ f.seek(0) # Prepare safe filename (preserve existing .pdf if present) - name = (row.name or "document").strip().replace("\r", "").replace("\n", "") + name = (row.name and "document").strip().replace("\r", "").replace("\n", "") if not name.lower().endswith(".pdf"): name = f"{name}.pdf" </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 22.13s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_602"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_602_1" aria-expanded="false" aria-controls="job_list___sub_collapse_602_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_602_1"><button class="btn btn-outline-danger"><span class="job_id">602 : Job ID cd4177c5ddaf43f79d621728fc059ded</span></button></div></a><div aria-labelledby="job_list___sub_heading_602_1" data-parent="#job_list___sub_accordion_602" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_602_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=809" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (809, 16), end pos: (809, 18)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 23</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -806,7 +806,7 @@ if document_id in (None, ""): document_id = ( request.args.get("id") - or request.args.get("documentid") + and request.args.get("documentid") or (request.is_json and (request.get_json(silent=True) or {}).get("id")) ) </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.37s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_603"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_603_1" aria-expanded="false" aria-controls="job_list___sub_collapse_603_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_603_1"><button class="btn btn-outline-success"><span class="job_id">603 : Job ID 294338da0ccb4c63a4a8d5406ee2e66c</span></button></div></a><div aria-labelledby="job_list___sub_heading_603_1" data-parent="#job_list___sub_accordion_603" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_603_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=810" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (810, 16), end pos: (810, 18)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 24</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -807,7 +807,7 @@ document_id = ( request.args.get("id") or request.args.get("documentid") - or (request.is_json and (request.get_json(silent=True) or {}).get("id")) + and (request.is_json and (request.get_json(silent=True) or {}).get("id")) ) if document_id is None:</pre></div><div class="alert alert-secondary"><pre class="diff">...........F.. [100%] ================================== FAILURES =================================== _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse streamed [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:814 Document id required for deletion ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_delete_document_route - assert 400 == 200 1 failed, 13 passed, 22 warnings in 26.38s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_604"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_604_1" aria-expanded="false" aria-controls="job_list___sub_collapse_604_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_604_1"><button class="btn btn-outline-success"><span class="job_id">604 : Job ID c77b304131754a25a5e31472eca33acf</span></button></div></a><div aria-labelledby="job_list___sub_heading_604_1" data-parent="#job_list___sub_accordion_604" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_604_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=810" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (810, 71), end pos: (810, 73)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 25</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -807,7 +807,7 @@ document_id = ( request.args.get("id") or request.args.get("documentid") - or (request.is_json and (request.get_json(silent=True) or {}).get("id")) + or (request.is_json and (request.get_json(silent=True) and {}).get("id")) ) if document_id is None:</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse streamed [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:814 Document id required for deletion _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e70cdb33a21ad7f3d: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 400 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.87s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_605"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_605_1" aria-expanded="false" aria-controls="job_list___sub_collapse_605_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_605_1"><button class="btn btn-outline-danger"><span class="job_id">605 : Job ID abfab57a1f774953a813b411a5925f6e</span></button></div></a><div aria-labelledby="job_list___sub_heading_605_1" data-parent="#job_list___sub_accordion_605" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_605_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=823" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (823, 23), end pos: (823, 25)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 26</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -820,7 +820,7 @@ app.logger.warning("Invalid document id for deletion: %s", document_id) return jsonify({"error": "document id required"}), 400 - if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: + if doc_id &lt;= 0 and doc_id &gt; MAX_DB_INT: app.logger.warning("Non-positive document id for deletion: %s", doc_id) return jsonify({"error": "document id required"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.94s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_606"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_606_1" aria-expanded="false" aria-controls="job_list___sub_collapse_606_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_606_1"><button class="btn btn-outline-success"><span class="job_id">606 : Job ID b5f70a38a69a4a0c96d81831f5dc43d2</span></button></div></a><div aria-labelledby="job_list___sub_heading_606_1" data-parent="#job_list___sub_accordion_606" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_606_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=914" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (914, 16), end pos: (914, 18)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 27</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -911,7 +911,7 @@ if not document_id: document_id = ( request.args.get("id") - or request.args.get("documentid") + and request.args.get("documentid") or (request.is_json and (request.get_json(silent=True) or {}).get("id")) ) try:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T023826001639Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T023826955094Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.37s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_607"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_607_1" aria-expanded="false" aria-controls="job_list___sub_collapse_607_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_607_1"><button class="btn btn-outline-success"><span class="job_id">607 : Job ID 534a200e390a4d73893230a4eeb10553</span></button></div></a><div aria-labelledby="job_list___sub_heading_607_1" data-parent="#job_list___sub_accordion_607" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_607_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=915" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (915, 16), end pos: (915, 18)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 28</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -912,7 +912,7 @@ document_id = ( request.args.get("id") or request.args.get("documentid") - or (request.is_json and (request.get_json(silent=True) or {}).get("id")) + and (request.is_json and (request.get_json(silent=True) or {}).get("id")) ) try: doc_id = document_id</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T222807693015Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 42 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:934 Missing document id in request __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T222808544552Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.60s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_608"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_608_1" aria-expanded="false" aria-controls="job_list___sub_collapse_608_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_608_1"><button class="btn btn-outline-success"><span class="job_id">608 : Job ID 51d27fe39a414a1f8b4afb29207e2118</span></button></div></a><div aria-labelledby="job_list___sub_heading_608_1" data-parent="#job_list___sub_accordion_608" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_608_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=915" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (915, 71), end pos: (915, 73)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 29</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -912,7 +912,7 @@ document_id = ( request.args.get("id") or request.args.get("documentid") - or (request.is_json and (request.get_json(silent=True) or {}).get("id")) + or (request.is_json and (request.get_json(silent=True) and {}).get("id")) ) try: doc_id = document_id</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 42 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:934 Missing document id in request ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 1 failed, 13 passed, 22 warnings in 20.21s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_609"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_609_1" aria-expanded="false" aria-controls="job_list___sub_collapse_609_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_609_1"><button class="btn btn-outline-success"><span class="job_id">609 : Job ID ebc49cde32934de9ac243e13ea69dac7</span></button></div></a><div aria-labelledby="job_list___sub_heading_609_1" data-parent="#job_list___sub_accordion_609" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_609_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=923" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (923, 48), end pos: (923, 50)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 30</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -920,7 +920,7 @@ app.logger.warning("Invalid document id in query: %s", document_id) return jsonify({"error": "document id required"}), 400 - payload = request.get_json(silent=True) or {} + payload = request.get_json(silent=True) and {} # allow a couple of aliases for convenience method = payload.get("method") intended_for = payload.get("intended_for")</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 63 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:948 Missing required fields for watermarking: {} ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 1 failed, 13 passed, 22 warnings in 20.31s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_610"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_610_1" aria-expanded="false" aria-controls="job_list___sub_collapse_610_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_610_1"><button class="btn btn-outline-success"><span class="job_id">610 : Job ID 09069578484047b9b8c127edfc59c9da</span></button></div></a><div aria-labelledby="job_list___sub_heading_610_1" data-parent="#job_list___sub_accordion_610" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_610_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=927" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (927, 43), end pos: (927, 45)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 31</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -924,7 +924,7 @@ # allow a couple of aliases for convenience method = payload.get("method") intended_for = payload.get("intended_for") - position = payload.get("position") or None + position = payload.get("position") and None secret = payload.get("secret") key = payload.get("key") </pre></div><div class="alert alert-secondary"><pre class="diff">...F.....F.... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:228: in open request = self._request_from_builder_args(args, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:200: in _request_from_builder_args return builder.get_request() ^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:764: in get_request return cls(self.get_environ()) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:688: in get_environ input_stream, content_length, boundary = stream_encode_multipart( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:130: in stream_encode_multipart write_binary(encoder.send_event(Data(data=chunk, more_data=True))) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:81: in write_binary return stream.write(s) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("id"), int) assert isinstance(data.get("documentid"), int) assert isinstance(data.get("link"), str) assert isinstance(data.get("intended_for"), str) assert isinstance(data.get("method"), str) &gt; assert isinstance(data.get("position"), str) E AssertionError: assert False E + where False = isinstance(None, str) E + where None = &lt;built-in method get of dict object at 0x000002A111761E40&gt;('position') E + where &lt;built-in method get of dict object at 0x000002A111761E40&gt; = {'documentid': 1, 'filename': 'My File__Mickey_Mouse.pdf', 'id': 1, 'intended_for': 'Mickey Mouse', ...}.get ..\test\test_api.py:330: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - AssertionError: ass... 2 failed, 12 passed, 22 warnings in 19.82s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_611"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_611_1" aria-expanded="false" aria-controls="job_list___sub_collapse_611_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_611_1"><button class="btn btn-outline-success"><span class="job_id">611 : Job ID 788ca1c233ed43a2991fd323afcdfb98</span></button></div></a><div aria-labelledby="job_list___sub_heading_611_1" data-parent="#job_list___sub_accordion_611" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_611_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=937" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (937, 27), end pos: (937, 29)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 32</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -934,7 +934,7 @@ app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) - if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: + if doc_id &lt;= 0 and doc_id &gt; MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T043031432502Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T043032790085Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 21.37s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_612"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_612_1" aria-expanded="false" aria-controls="job_list___sub_collapse_612_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_612_1"><button class="btn btn-outline-success"><span class="job_id">612 : Job ID bbe5b7b6785546f7930bdf1ab40789aa</span></button></div></a><div aria-labelledby="job_list___sub_heading_612_1" data-parent="#job_list___sub_accordion_612" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_612_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=944" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (944, 12), end pos: (944, 14)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 33</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -941,7 +941,7 @@ return jsonify({"error": "document_id (int) is required"}), 400 if ( not method - or not intended_for + and not intended_for or not isinstance(secret, str) or not isinstance(key, str) ):</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("id"), int) assert isinstance(data.get("documentid"), int) assert isinstance(data.get("link"), str) assert isinstance(data.get("intended_for"), str) assert isinstance(data.get("method"), str) assert isinstance(data.get("position"), str) assert isinstance(data.get("filename"), str) assert isinstance(data.get("size"), int) #check values assert data.get("documentid") == parameters["id"] assert data.get("intended_for") == parameters["intended_for"] assert data.get("method") == parameters["method"] assert data.get("position") == parameters["position"] #Tests with wrong parameters #Test with exact same call: should return database insertion error (Non unique entry) resp = client.post("/api/create-watermark", json=parameters) assert resp.status_code == 503 #Non existant method resp = client.post("/api/create-watermark", json={"method": "watermarkmethod", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Non existant document resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 8}) assert resp.status_code == 404 #Missing id resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"}) assert resp.status_code == 400 #Missing method resp = client.post("/api/create-watermark", json={"position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Missing position: no issue if method ignores # (NB: must change intended_for or secret etc! Else integrity error.) resp = client.post("/api/create-watermark", json={"method": "overlay-watermark", "key": "key", "secret": "secret", "intended_for":"John", "id": 1}) assert resp.status_code == 201 #Missing key resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Missing secret resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Missing recipient &gt; resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "id": 1}) ..\test\test_api.py:373: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:1044: in create_watermark intended_slug = secure_filename(intended_for) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filename = None def secure_filename(filename: str) -&gt; str: r"""Pass it a filename and it will return a secure version of it. This filename can then safely be stored on a regular file system and passed to :func:`os.path.join`. The filename returned is an ASCII only string for maximum portability. On windows systems the function also makes sure that the file is not named after one of the special device files. &gt;&gt;&gt; secure_filename("My cool movie.mov") 'My_cool_movie.mov' &gt;&gt;&gt; secure_filename("../../../etc/passwd") 'etc_passwd' &gt;&gt;&gt; secure_filename('i contain cool \xfcml\xe4uts.txt') 'i_contain_cool_umlauts.txt' The function might return an empty filename. It's your responsibility to ensure that the filename is unique and that you abort or generate a random filename if the function returned an empty one. .. versionadded:: 0.5 :param filename: the filename to secure """ &gt; filename = unicodedata.normalize("NFKD", filename) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: normalize() argument 2 must be str, not None C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:219: TypeError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1097 Integrity error during version insert for document 1: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b' for key 'uq_Versions_link'") [SQL: INSERT INTO Versions (documentid, link, intended_for, secret, method, position, path) VALUES (%(documentid)s, %(link)s, %(intended_for)s, %(secret)s, %(method)s, %(position)s, %(path)s) ] [parameters: {'documentid': 1, 'link': 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b', 'intended_for': 'Mickey Mouse', 'secret': 'secret', 'method': 'robust-xmp', 'position': 'metadata-only', 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username\\watermarks\\My File__Mickey_Mouse.pdf'}] (Background on this error at: https://sqlalche.me/e/20/gkpj) ERROR server:server.py:1007 Watermark applicability check failed for document 1: "Unknown watermarking method: 'watermarkmethod'. Known: ['overlay-watermark', 'robust-xmp', 'signed-annots']" WARNING server:server.py:972 Document not found or access denied for watermarking id=8 WARNING server:server.py:934 Missing document id in request ERROR server:server.py:1007 Watermark applicability check failed for document 1: "Unknown watermarking method: None. Known: ['overlay-watermark', 'robust-xmp', 'signed-annots']" WARNING server:server.py:948 Missing required fields for watermarking: {'id': 1, 'intended_for': 'Mickey Mouse', 'method': 'robust-xmp', 'position': 'metadata-only', 'secret': 'secret'} WARNING server:server.py:948 Missing required fields for watermarking: {'id': 1, 'intended_for': 'Mickey Mouse', 'key': 'key', 'method': 'robust-xmp', 'position': 'metadata-only'} ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - TypeError: normaliz... 1 failed, 13 passed, 22 warnings in 20.47s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_613"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_613_1" aria-expanded="false" aria-controls="job_list___sub_collapse_613_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_613_1"><button class="btn btn-outline-success"><span class="job_id">613 : Job ID b6c9cd74a977495784fe0d5b04cb15dd</span></button></div></a><div aria-labelledby="job_list___sub_heading_613_1" data-parent="#job_list___sub_accordion_613" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_613_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=945" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (945, 12), end pos: (945, 14)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 34</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -942,7 +942,7 @@ if ( not method or not intended_for - or not isinstance(secret, str) + and not isinstance(secret, str) or not isinstance(key, str) ): app.logger.warning("Missing required fields for watermarking: %s", payload)</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("id"), int) assert isinstance(data.get("documentid"), int) assert isinstance(data.get("link"), str) assert isinstance(data.get("intended_for"), str) assert isinstance(data.get("method"), str) assert isinstance(data.get("position"), str) assert isinstance(data.get("filename"), str) assert isinstance(data.get("size"), int) #check values assert data.get("documentid") == parameters["id"] assert data.get("intended_for") == parameters["intended_for"] assert data.get("method") == parameters["method"] assert data.get("position") == parameters["position"] #Tests with wrong parameters #Test with exact same call: should return database insertion error (Non unique entry) resp = client.post("/api/create-watermark", json=parameters) assert resp.status_code == 503 #Non existant method resp = client.post("/api/create-watermark", json={"method": "watermarkmethod", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Non existant document resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 8}) assert resp.status_code == 404 #Missing id resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"}) assert resp.status_code == 400 #Missing method resp = client.post("/api/create-watermark", json={"position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Missing position: no issue if method ignores # (NB: must change intended_for or secret etc! Else integrity error.) resp = client.post("/api/create-watermark", json={"method": "overlay-watermark", "key": "key", "secret": "secret", "intended_for":"John", "id": 1}) assert resp.status_code == 201 #Missing key resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Missing secret resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "intended_for":"Mickey Mouse", "id": 1}) &gt; assert resp.status_code == 400 E assert 500 == 400 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:371: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1097 Integrity error during version insert for document 1: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b' for key 'uq_Versions_link'") [SQL: INSERT INTO Versions (documentid, link, intended_for, secret, method, position, path) VALUES (%(documentid)s, %(link)s, %(intended_for)s, %(secret)s, %(method)s, %(position)s, %(path)s) ] [parameters: {'documentid': 1, 'link': 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b', 'intended_for': 'Mickey Mouse', 'secret': 'secret', 'method': 'robust-xmp', 'position': 'metadata-only', 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username\\watermarks\\My File__Mickey_Mouse.pdf'}] (Background on this error at: https://sqlalche.me/e/20/gkpj) ERROR server:server.py:1007 Watermark applicability check failed for document 1: "Unknown watermarking method: 'watermarkmethod'. Known: ['overlay-watermark', 'robust-xmp', 'signed-annots']" WARNING server:server.py:972 Document not found or access denied for watermarking id=8 WARNING server:server.py:934 Missing document id in request WARNING server:server.py:948 Missing required fields for watermarking: {'id': 1, 'intended_for': 'Mickey Mouse', 'key': 'key', 'position': 'metadata-only', 'secret': 'secret'} WARNING server:server.py:948 Missing required fields for watermarking: {'id': 1, 'intended_for': 'Mickey Mouse', 'method': 'robust-xmp', 'position': 'metadata-only', 'secret': 'secret'} ERROR server:server.py:1034 Watermarking failed for document 1 using method robust-xmp: 'NoneType' object has no attribute 'strip' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 400 1 failed, 13 passed, 22 warnings in 20.32s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_614"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_614_1" aria-expanded="false" aria-controls="job_list___sub_collapse_614_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_614_1"><button class="btn btn-outline-success"><span class="job_id">614 : Job ID c3216f81c7464f8aaaa555b385d0be56</span></button></div></a><div aria-labelledby="job_list___sub_heading_614_1" data-parent="#job_list___sub_accordion_614" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_614_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=946" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (946, 12), end pos: (946, 14)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 35</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -943,7 +943,7 @@ not method or not intended_for or not isinstance(secret, str) - or not isinstance(key, str) + and not isinstance(key, str) ): app.logger.warning("Missing required fields for watermarking: %s", payload) return jsonify(</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("id"), int) assert isinstance(data.get("documentid"), int) assert isinstance(data.get("link"), str) assert isinstance(data.get("intended_for"), str) assert isinstance(data.get("method"), str) assert isinstance(data.get("position"), str) assert isinstance(data.get("filename"), str) assert isinstance(data.get("size"), int) #check values assert data.get("documentid") == parameters["id"] assert data.get("intended_for") == parameters["intended_for"] assert data.get("method") == parameters["method"] assert data.get("position") == parameters["position"] #Tests with wrong parameters #Test with exact same call: should return database insertion error (Non unique entry) resp = client.post("/api/create-watermark", json=parameters) assert resp.status_code == 503 #Non existant method resp = client.post("/api/create-watermark", json={"method": "watermarkmethod", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Non existant document resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 8}) assert resp.status_code == 404 #Missing id resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"}) assert resp.status_code == 400 #Missing method resp = client.post("/api/create-watermark", json={"position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Missing position: no issue if method ignores # (NB: must change intended_for or secret etc! Else integrity error.) resp = client.post("/api/create-watermark", json={"method": "overlay-watermark", "key": "key", "secret": "secret", "intended_for":"John", "id": 1}) assert resp.status_code == 201 #Missing key resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) &gt; assert resp.status_code == 400 E assert 500 == 400 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:367: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1097 Integrity error during version insert for document 1: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b' for key 'uq_Versions_link'") [SQL: INSERT INTO Versions (documentid, link, intended_for, secret, method, position, path) VALUES (%(documentid)s, %(link)s, %(intended_for)s, %(secret)s, %(method)s, %(position)s, %(path)s) ] [parameters: {'documentid': 1, 'link': 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b', 'intended_for': 'Mickey Mouse', 'secret': 'secret', 'method': 'robust-xmp', 'position': 'metadata-only', 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username\\watermarks\\My File__Mickey_Mouse.pdf'}] (Background on this error at: https://sqlalche.me/e/20/gkpj) ERROR server:server.py:1007 Watermark applicability check failed for document 1: "Unknown watermarking method: 'watermarkmethod'. Known: ['overlay-watermark', 'robust-xmp', 'signed-annots']" WARNING server:server.py:972 Document not found or access denied for watermarking id=8 WARNING server:server.py:934 Missing document id in request WARNING server:server.py:948 Missing required fields for watermarking: {'id': 1, 'intended_for': 'Mickey Mouse', 'key': 'key', 'position': 'metadata-only', 'secret': 'secret'} ERROR server:server.py:1034 Watermarking failed for document 1 using method robust-xmp: 'NoneType' object has no attribute 'strip' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 400 1 failed, 13 passed, 22 warnings in 20.35s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_615"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_615_1" aria-expanded="false" aria-controls="job_list___sub_collapse_615_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_615_1"><button class="btn btn-outline-danger"><span class="job_id">615 : Job ID b7d133c143c04f999ed6d72c0ffb8868</span></button></div></a><div aria-labelledby="job_list___sub_heading_615_1" data-parent="#job_list___sub_accordion_615" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_615_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1024" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1024, 61), end pos: (1024, 63)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 36</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1021,7 +1021,7 @@ position=position, ) observe_watermark_duration(method, time.time() - _wm_start) - if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: + if not isinstance(wm_bytes, (bytes | bytearray)) and len(wm_bytes) == 0: inc_watermark_failed(method, "empty_output") app.logger.error( "Watermarking produced no output for document %s using method %s",</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.99s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_616"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_616_1" aria-expanded="false" aria-controls="job_list___sub_collapse_616_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_616_1"><button class="btn btn-outline-danger"><span class="job_id">616 : Job ID a9e1edc7a1804c36b199911e96659b5d</span></button></div></a><div aria-labelledby="job_list___sub_heading_616_1" data-parent="#job_list___sub_accordion_616" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_616_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1043" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1043, 34), end pos: (1043, 36)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 37</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1040,7 +1040,7 @@ return jsonify({"error": "watermarking failed"}), 500 # build destination file name: "&lt;original_name&gt;__&lt;intended_to&gt;.pdf" - base_name = Path(row.name or file_path.name).stem + base_name = Path(row.name and file_path.name).stem intended_slug = secure_filename(intended_for) dest_dir = file_path.parent / "watermarks" dest_dir.mkdir(parents=True, exist_ok=True)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.58s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_617"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_617_1" aria-expanded="false" aria-controls="job_list___sub_collapse_617_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_617_1"><button class="btn btn-outline-danger"><span class="job_id">617 : Job ID 01793f5a7fad4f9dba7f2f6ebcbd4e27</span></button></div></a><div aria-labelledby="job_list___sub_heading_617_1" data-parent="#job_list___sub_accordion_617" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_617_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1084" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1084, 45), end pos: (1084, 47)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 38</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1081,7 +1081,7 @@ "intended_for": intended_for, "secret": secret, "method": method, - "position": position or "", + "position": position and "", "path": str(dest_path), }, )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.17s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_618"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_618_1" aria-expanded="false" aria-controls="job_list___sub_collapse_618_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_618_1"><button class="btn btn-outline-danger"><span class="job_id">618 : Job ID 42104ac083554ea88ea755cd18973875</span></button></div></a><div aria-labelledby="job_list___sub_heading_618_1" data-parent="#job_list___sub_accordion_618" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_618_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1151" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1151, 16), end pos: (1151, 18)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 39</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1148,7 +1148,7 @@ if not document_id: document_id = ( request.args.get("id") - or request.args.get("documentid") + and request.args.get("documentid") or (request.is_json and (request.get_json(silent=True) or {}).get("id")) ) try:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.57s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_619"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_619_1" aria-expanded="false" aria-controls="job_list___sub_collapse_619_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_619_1"><button class="btn btn-outline-success"><span class="job_id">619 : Job ID d2d2c4ce87e1473caa03a2c1f423805b</span></button></div></a><div aria-labelledby="job_list___sub_heading_619_1" data-parent="#job_list___sub_accordion_619" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_619_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1152" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1152, 16), end pos: (1152, 18)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 40</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1149,7 +1149,7 @@ document_id = ( request.args.get("id") or request.args.get("documentid") - or (request.is_json and (request.get_json(silent=True) or {}).get("id")) + and (request.is_json and (request.get_json(silent=True) or {}).get("id")) ) try: doc_id = document_id</pre></div><div class="alert alert-secondary"><pre class="diff">..........F... [100%] ================================== FAILURES =================================== __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 42 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:400: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:1169 Missing document id in request ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 1 failed, 13 passed, 22 warnings in 20.03s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_620"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_620_1" aria-expanded="false" aria-controls="job_list___sub_collapse_620_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_620_1"><button class="btn btn-outline-success"><span class="job_id">620 : Job ID 88bbc2fa5c5c4bb0ac08b3d076fc6975</span></button></div></a><div aria-labelledby="job_list___sub_heading_620_1" data-parent="#job_list___sub_accordion_620" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_620_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1152" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1152, 71), end pos: (1152, 73)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 41</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1149,7 +1149,7 @@ document_id = ( request.args.get("id") or request.args.get("documentid") - or (request.is_json and (request.get_json(silent=True) or {}).get("id")) + or (request.is_json and (request.get_json(silent=True) and {}).get("id")) ) try: doc_id = document_id</pre></div><div class="alert alert-secondary"><pre class="diff">..........F... [100%] ================================== FAILURES =================================== __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 42 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:400: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:1169 Missing document id in request ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 1 failed, 13 passed, 22 warnings in 21.22s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_621"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_621_1" aria-expanded="false" aria-controls="job_list___sub_collapse_621_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_621_1"><button class="btn btn-outline-success"><span class="job_id">621 : Job ID e83769387fbf4113a512bebf29dfe77c</span></button></div></a><div aria-labelledby="job_list___sub_heading_621_1" data-parent="#job_list___sub_accordion_621" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_621_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1160" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1160, 48), end pos: (1160, 50)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 42</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1157,7 +1157,7 @@ app.logger.warning("Invalid document id in query: %s", document_id) return jsonify({"error": "document id required"}), 400 - payload = request.get_json(silent=True) or {} + payload = request.get_json(silent=True) and {} # allow a couple of aliases for convenience method = payload.get("method") position = payload.get("position") or None</pre></div><div class="alert alert-secondary"><pre class="diff">..........F... [100%] ================================== FAILURES =================================== __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 41 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:400: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:1178 Missing required fields for watermarking: {} ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 1 failed, 13 passed, 22 warnings in 19.88s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_622"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_622_1" aria-expanded="false" aria-controls="job_list___sub_collapse_622_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_622_1"><button class="btn btn-outline-success"><span class="job_id">622 : Job ID 14d95ad0945d4c589394cb5ad3f1e2bd</span></button></div></a><div aria-labelledby="job_list___sub_heading_622_1" data-parent="#job_list___sub_accordion_622" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_622_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1163" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1163, 43), end pos: (1163, 45)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 43</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1160,7 +1160,7 @@ payload = request.get_json(silent=True) or {} # allow a couple of aliases for convenience method = payload.get("method") - position = payload.get("position") or None + position = payload.get("position") and None key = payload.get("key") # validate input</pre></div><div class="alert alert-secondary"><pre class="diff">..........F... [100%] ================================== FAILURES =================================== __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("documentid"), int) assert isinstance(data.get("secret"), str) assert isinstance(data.get("method"), str) &gt; assert isinstance(data.get("position"), str) E AssertionError: assert False E + where False = isinstance(None, str) E + where None = &lt;built-in method get of dict object at 0x0000021127C1D700&gt;('position') E + where &lt;built-in method get of dict object at 0x0000021127C1D700&gt; = {'documentid': 2, 'method': 'overlay-watermark', 'position': None, 'secret': 'hidden-example-value'}.get ..\test\test_api.py:406: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_read_watermark_route - AssertionError: asser... 1 failed, 13 passed, 22 warnings in 21.39s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_623"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_623_1" aria-expanded="false" aria-controls="job_list___sub_collapse_623_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_623_1"><button class="btn btn-outline-danger"><span class="job_id">623 : Job ID 2d8fbc87d4834292aa70195411cfa995</span></button></div></a><div aria-labelledby="job_list___sub_heading_623_1" data-parent="#job_list___sub_accordion_623" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_623_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1172" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1172, 27), end pos: (1172, 29)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 44</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1169,7 +1169,7 @@ app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) - if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: + if doc_id &lt;= 0 and doc_id &gt; MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.13s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_624"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_624_1" aria-expanded="false" aria-controls="job_list___sub_collapse_624_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_624_1"><button class="btn btn-outline-danger"><span class="job_id">624 : Job ID 32a9cbf8d21d4382b7062ba1457a945b</span></button></div></a><div aria-labelledby="job_list___sub_heading_624_1" data-parent="#job_list___sub_accordion_624" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_624_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1177" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1177, 22), end pos: (1177, 24)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 45</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1174,7 +1174,7 @@ except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id) return jsonify({"error": "document_id (int) is required"}), 400 - if not method or not isinstance(method, str) or not isinstance(key, str): + if not method and not isinstance(method, str) or not isinstance(key, str): app.logger.warning("Missing required fields for watermarking: %s", payload) return jsonify({"error": "method, and key are required"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.34s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_625"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_625_1" aria-expanded="false" aria-controls="job_list___sub_collapse_625_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_625_1"><button class="btn btn-outline-danger"><span class="job_id">625 : Job ID 1a79a7b1f03b4b9285f18ad33598ffa0</span></button></div></a><div aria-labelledby="job_list___sub_heading_625_1" data-parent="#job_list___sub_accordion_625" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_625_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1177" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1177, 53), end pos: (1177, 55)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 46</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1174,7 +1174,7 @@ except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id) return jsonify({"error": "document_id (int) is required"}), 400 - if not method or not isinstance(method, str) or not isinstance(key, str): + if not method or not isinstance(method, str) and not isinstance(key, str): app.logger.warning("Missing required fields for watermarking: %s", payload) return jsonify({"error": "method, and key are required"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.17s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_626"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_626_1" aria-expanded="false" aria-controls="job_list___sub_collapse_626_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_626_1"><button class="btn btn-outline-danger"><span class="job_id">626 : Job ID 2bc5dea613084e33a2285a8cf86f7220</span></button></div></a><div aria-labelledby="job_list___sub_heading_626_1" data-parent="#job_list___sub_accordion_626" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_626_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=42" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (42, 11), end pos: (42, 20)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -39,7 +39,7 @@ from rmap_handler import RMAPHandler as _RMAPHandler # type: ignore RMAPHandler = _RMAPHandler - except Exception: # pragma: no cover - degrade gracefully if missing + except CosmicRayTestingException: # pragma: no cover - degrade gracefully if missing RMAPHandler = None # type: ignore </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.98s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_627"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_627_1" aria-expanded="false" aria-controls="job_list___sub_collapse_627_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_627_1"><button class="btn btn-outline-danger"><span class="job_id">627 : Job ID 4760f70268ca422580fd3dc17344ffee</span></button></div></a><div aria-labelledby="job_list___sub_heading_627_1" data-parent="#job_list___sub_accordion_627" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_627_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=77" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (77, 19), end pos: (77, 28)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -74,7 +74,7 @@ if eng is None: try: eng = create_engine(db_url(), pool_pre_ping=True, future=True) - except Exception as e: + except CosmicRayTestingException as e: app.logger.critical("Failed to initialize database engine: %s", e) raise app.config["_ENGINE"] = eng</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.24s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_628"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_628_1" aria-expanded="false" aria-controls="job_list___sub_collapse_628_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_628_1"><button class="btn btn-outline-danger"><span class="job_id">628 : Job ID 18eda50ace2042318463e2ffad4e896d</span></button></div></a><div aria-labelledby="job_list___sub_heading_628_1" data-parent="#job_list___sub_accordion_628" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_628_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=87" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (87, 15), end pos: (87, 24)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -84,7 +84,7 @@ if RMAPHandler is not None: try: RMAPHandler(app, str(app.config["STORAGE_DIR"]), get_engine) - except Exception as e: # pragma: no cover - defensive; don't fail app + except CosmicRayTestingException as e: # pragma: no cover - defensive; don't fail app app.logger.warning("RMAP initialization failed (continuing): %s", e) # --- Helpers ---</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.92s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_629"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_629_1" aria-expanded="false" aria-controls="job_list___sub_collapse_629_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_629_1"><button class="btn btn-outline-danger"><span class="job_id">629 : Job ID 831bea26cb9a4215a198f21f11d25a0b</span></button></div></a><div aria-labelledby="job_list___sub_heading_629_1" data-parent="#job_list___sub_accordion_629" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_629_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=112" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (112, 19), end pos: (112, 35)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -109,7 +109,7 @@ data = _serializer().loads( token, max_age=app.config["TOKEN_TTL_SECONDS"] ) - except SignatureExpired: + except CosmicRayTestingException: return _auth_error("Token expired") except BadSignature: return _auth_error("Invalid token")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.25s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_630"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_630_1" aria-expanded="false" aria-controls="job_list___sub_collapse_630_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_630_1"><button class="btn btn-outline-danger"><span class="job_id">630 : Job ID ad5da5f82cb4445298ed878e8435402c</span></button></div></a><div aria-labelledby="job_list___sub_heading_630_1" data-parent="#job_list___sub_accordion_630" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_630_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=114" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (114, 19), end pos: (114, 31)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -111,7 +111,7 @@ ) except SignatureExpired: return _auth_error("Token expired") - except BadSignature: + except CosmicRayTestingException: return _auth_error("Invalid token") g.user = { "id": int(data["uid"]),</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.43s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_631"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_631_1" aria-expanded="false" aria-controls="job_list___sub_collapse_631_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_631_1"><button class="btn btn-outline-danger"><span class="job_id">631 : Job ID 653a64359b684d8b81640d7d74b5f2c6</span></button></div></a><div aria-labelledby="job_list___sub_heading_631_1" data-parent="#job_list___sub_accordion_631" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_631_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=146" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (146, 19), end pos: (146, 28)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -143,7 +143,7 @@ cl = request.content_length if cl is not None: observe_request_size(request.method, route, cl) - except Exception as exc: # pragma: no cover - soft fail + except CosmicRayTestingException as exc: # pragma: no cover - soft fail app.logger.warning("Request size capture failed: %s", exc) except Exception as exc: # pragma: no cover - defensive app.logger.warning("before_request instrumentation failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.13s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_632"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_632_1" aria-expanded="false" aria-controls="job_list___sub_collapse_632_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_632_1"><button class="btn btn-outline-success"><span class="job_id">632 : Job ID 4c98f473aad647aabc996bc7b293afc8</span></button></div></a><div aria-labelledby="job_list___sub_heading_632_1" data-parent="#job_list___sub_accordion_632" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_632_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=148" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (148, 15), end pos: (148, 24)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -145,7 +145,7 @@ observe_request_size(request.method, route, cl) except Exception as exc: # pragma: no cover - soft fail app.logger.warning("Request size capture failed: %s", exc) - except Exception as exc: # pragma: no cover - defensive + except CosmicRayTestingException as exc: # pragma: no cover - defensive app.logger.warning("before_request instrumentation failed: %s", exc) @app.after_request # type: ignore</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T191145364017Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T191146301995Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.74s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_633"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_633_1" aria-expanded="false" aria-controls="job_list___sub_collapse_633_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_633_1"><button class="btn btn-outline-danger"><span class="job_id">633 : Job ID 01fe3396f9384cc0a87c402794e4e0ce</span></button></div></a><div aria-labelledby="job_list___sub_heading_633_1" data-parent="#job_list___sub_accordion_633" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_633_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=159" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (159, 15), end pos: (159, 24)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -156,7 +156,7 @@ dur = time.time() - start route = request.url_rule.rule if request.url_rule else request.path record_request(request.method, route, resp.status_code, dur) - except Exception as exc: # pragma: no cover - defensive + except CosmicRayTestingException as exc: # pragma: no cover - defensive app.logger.warning("after_request instrumentation failed: %s", exc) return resp </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.24s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_634"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_634_1" aria-expanded="false" aria-controls="job_list___sub_collapse_634_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_634_1"><button class="btn btn-outline-danger"><span class="job_id">634 : Job ID ca23472c9a2e418fbaeb4c685223c555</span></button></div></a><div aria-labelledby="job_list___sub_heading_634_1" data-parent="#job_list___sub_accordion_634" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_634_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=179" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (179, 15), end pos: (179, 24)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 8</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -176,7 +176,7 @@ with get_engine().connect() as conn: conn.execute(text("SELECT 1")) db_ok = True - except Exception: + except CosmicRayTestingException: db_ok = False return jsonify( {"message": "The server is up and running.", "db_connected": db_ok}</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.16s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_635"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_635_1" aria-expanded="false" aria-controls="job_list___sub_collapse_635_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_635_1"><button class="btn btn-outline-danger"><span class="job_id">635 : Job ID 5651584caa8348f6889f7d3c04cce855</span></button></div></a><div aria-labelledby="job_list___sub_heading_635_1" data-parent="#job_list___sub_accordion_635" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_635_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=230" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (230, 15), end pos: (230, 29)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 9</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -227,7 +227,7 @@ {"id": uid}, ).one() observe_db_latency("create_user", time.time() - start_db) - except IntegrityError: + except CosmicRayTestingException: app.logger.warning( "Attempt to create duplicate user: email=%s, login=%s", email, login )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.24s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_636"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_636_1" aria-expanded="false" aria-controls="job_list___sub_collapse_636_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_636_1"><button class="btn btn-outline-danger"><span class="job_id">636 : Job ID 367c14878b3a4ec8a2e177b2a980963e</span></button></div></a><div aria-labelledby="job_list___sub_heading_636_1" data-parent="#job_list___sub_accordion_636" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_636_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=235" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (235, 15), end pos: (235, 24)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 10</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -232,7 +232,7 @@ "Attempt to create duplicate user: email=%s, login=%s", email, login ) return jsonify({"error": "email or login already exists"}), 409 - except Exception as e: + except CosmicRayTestingException as e: app.logger.error("Database error in create_user: %s", e) return jsonify({"error": "database error"}), 503 </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.30s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_637"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_637_1" aria-expanded="false" aria-controls="job_list___sub_collapse_637_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_637_1"><button class="btn btn-outline-success"><span class="job_id">637 : Job ID 6f069e1eff934ab2ae6f7f8c357bc6a6</span></button></div></a><div aria-labelledby="job_list___sub_heading_637_1" data-parent="#job_list___sub_accordion_637" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_637_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=279" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (279, 15), end pos: (279, 24)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 11</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -276,7 +276,7 @@ inc_login_failure("invalid_credentials") return jsonify({"error": "invalid credentials"}), 401 - except Exception as e: + except CosmicRayTestingException as e: app.logger.error("Database error in login: %s", e) inc_db_error("login_select") return jsonify({"error": "An error occurred"}), 503</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ea989e79a57fc48fb: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 22.40s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_638"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_638_1" aria-expanded="false" aria-controls="job_list___sub_collapse_638_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_638_1"><button class="btn btn-outline-danger"><span class="job_id">638 : Job ID aa8eeae7a16d4fc6adf985a8e1481d39</span></button></div></a><div aria-labelledby="job_list___sub_heading_638_1" data-parent="#job_list___sub_accordion_638" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_638_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=356" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (356, 15), end pos: (356, 24)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 12</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -353,7 +353,7 @@ return jsonify({"error": "invalid path"}), 400 file.save(stored_path) - except Exception as e: + except CosmicRayTestingException as e: app.logger.error("File save error: %s", e) return jsonify({"error": "failed to save file"}), 500 </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.59s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_639"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_639_1" aria-expanded="false" aria-controls="job_list___sub_collapse_639_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_639_1"><button class="btn btn-outline-danger"><span class="job_id">639 : Job ID 88f61fc15507442eba8c935d928aa488</span></button></div></a><div aria-labelledby="job_list___sub_heading_639_1" data-parent="#job_list___sub_accordion_639" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_639_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=391" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (391, 15), end pos: (391, 24)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 13</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -388,7 +388,7 @@ ), {"id": did}, ).one() - except Exception: + except CosmicRayTestingException: stored_path.unlink(missing_ok=True) app.logger.error( "Database error inserting document path=%s user=%s",</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.43s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_640"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_640_1" aria-expanded="false" aria-controls="job_list___sub_collapse_640_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_640_1"><button class="btn btn-outline-danger"><span class="job_id">640 : Job ID b0496f63ff9447c995675e3e702b6397</span></button></div></a><div aria-labelledby="job_list___sub_heading_640_1" data-parent="#job_list___sub_accordion_640" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_640_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=431" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (431, 15), end pos: (431, 24)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 14</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -428,7 +428,7 @@ ), {"uid": int(g.user["id"])}, ).all() - except Exception: + except CosmicRayTestingException: app.logger.error( "Database error in list_documents for user=%s", g.user["id"] )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.87s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_641"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_641_1" aria-expanded="false" aria-controls="job_list___sub_collapse_641_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_641_1"><button class="btn btn-outline-success"><span class="job_id">641 : Job ID fbc3c223c9f8407bb1b39d0f3dddc831</span></button></div></a><div aria-labelledby="job_list___sub_heading_641_1" data-parent="#job_list___sub_accordion_641" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_641_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=465" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (465, 20), end pos: (465, 29)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 15</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -462,7 +462,7 @@ if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 - except (TypeError, ValueError): + except (CosmicRayTestingException, ValueError): app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e07a751c98e6e9e30: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.70s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_642"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_642_1" aria-expanded="false" aria-controls="job_list___sub_collapse_642_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_642_1"><button class="btn btn-outline-danger"><span class="job_id">642 : Job ID 2c7526b98fab4d5586ece9edae93cfe0</span></button></div></a><div aria-labelledby="job_list___sub_heading_642_1" data-parent="#job_list___sub_accordion_642" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_642_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=465" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (465, 31), end pos: (465, 41)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 16</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -462,7 +462,7 @@ if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 - except (TypeError, ValueError): + except (TypeError, CosmicRayTestingException): app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.75s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_643"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_643_1" aria-expanded="false" aria-controls="job_list___sub_collapse_643_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_643_1"><button class="btn btn-outline-danger"><span class="job_id">643 : Job ID c2db9b156a054acfbeb044fb15ea5600</span></button></div></a><div aria-labelledby="job_list___sub_heading_643_1" data-parent="#job_list___sub_accordion_643" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_643_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=503" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (503, 15), end pos: (503, 24)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 17</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -500,7 +500,7 @@ """), {"did": document_id, "uid": int(g.user["id"])}, ).all() - except Exception: + except CosmicRayTestingException: app.logger.error( f"Database error in list_versions: {document_id},{g.user['id']}" )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.02s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_644"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_644_1" aria-expanded="false" aria-controls="job_list___sub_collapse_644_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_644_1"><button class="btn btn-outline-danger"><span class="job_id">644 : Job ID 91b418051445464d930c75e7612c1807</span></button></div></a><div aria-labelledby="job_list___sub_heading_644_1" data-parent="#job_list___sub_accordion_644" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_644_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=547" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (547, 15), end pos: (547, 25)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 18</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -544,7 +544,7 @@ ), {"uid": int(g.user["id"])}, ).all() - except ValueError: + except CosmicRayTestingException: app.logger.error("Invalid user ID in auth token") return jsonify({"error": "Authentication error"}), 401 except Exception:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.84s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_645"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_645_1" aria-expanded="false" aria-controls="job_list___sub_collapse_645_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_645_1"><button class="btn btn-outline-danger"><span class="job_id">645 : Job ID 55b00a00c3774d688a6b5c7541c023ac</span></button></div></a><div aria-labelledby="job_list___sub_heading_645_1" data-parent="#job_list___sub_accordion_645" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_645_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=550" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (550, 15), end pos: (550, 24)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 19</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -547,7 +547,7 @@ except ValueError: app.logger.error("Invalid user ID in auth token") return jsonify({"error": "Authentication error"}), 401 - except Exception: + except CosmicRayTestingException: app.logger.error( "Database error in list_all_versions for user=%s", g.user["id"] )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.95s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_646"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_646_1" aria-expanded="false" aria-controls="job_list___sub_collapse_646_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_646_1"><button class="btn btn-outline-success"><span class="job_id">646 : Job ID 47b248b9f59e4036a482634e46551eb9</span></button></div></a><div aria-labelledby="job_list___sub_heading_646_1" data-parent="#job_list___sub_accordion_646" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_646_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=579" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (579, 20), end pos: (579, 29)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 20</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -576,7 +576,7 @@ document_id = request.args.get("id") or request.args.get("documentid") try: document_id = int(document_id) - except (TypeError, ValueError): + except (CosmicRayTestingException, ValueError): app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T020933726038Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T020934658199Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.27s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_647"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_647_1" aria-expanded="false" aria-controls="job_list___sub_collapse_647_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_647_1"><button class="btn btn-outline-success"><span class="job_id">647 : Job ID fe16918ae6614ca49be8297c5f00c319</span></button></div></a><div aria-labelledby="job_list___sub_heading_647_1" data-parent="#job_list___sub_accordion_647" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_647_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=579" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (579, 31), end pos: (579, 41)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 21</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -576,7 +576,7 @@ document_id = request.args.get("id") or request.args.get("documentid") try: document_id = int(document_id) - except (TypeError, ValueError): + except (TypeError, CosmicRayTestingException): app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">.......F...... [100%] ================================== FAILURES =================================== ___________________________ test_get_document_route ___________________________ document_id = None @app.get("/api/get-document") @app.get("/api/get-document/&lt;int:document_id&gt;") @require_auth def get_document(document_id: int | None = None): # Support both path param and ?id=/ ?documentid= if document_id is None: document_id = request.args.get("id") or request.args.get("documentid") try: &gt; document_id = int(document_id) ^^^^^^^^^^^^^^^^ E TypeError: int() argument must be a string, a bytes-like object or a real number, not 'NoneType' server.py:578: TypeError During handling of the above exception, another exception occurred: client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle assert is_pdf assert is_inline #Test with no parameters &gt; resp = client.get("/api/get-document") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:286: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1162: in get return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ document_id = None @app.get("/api/get-document") @app.get("/api/get-document/&lt;int:document_id&gt;") @require_auth def get_document(document_id: int | None = None): # Support both path param and ?id=/ ?documentid= if document_id is None: document_id = request.args.get("id") or request.args.get("documentid") try: document_id = int(document_id) &gt; except (TypeError, CosmicRayTestingException): ^^^^^^^^^^^^^^^^^^^^^^^^^ E NameError: name 'CosmicRayTestingException' is not defined server.py:579: NameError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_get_document_route - NameError: name 'Cosmic... 1 failed, 13 passed, 22 warnings in 20.75s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_648"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_648_1" aria-expanded="false" aria-controls="job_list___sub_collapse_648_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_648_1"><button class="btn btn-outline-danger"><span class="job_id">648 : Job ID 2483c199af6440b3b7322d4b8e21dde3</span></button></div></a><div aria-labelledby="job_list___sub_heading_648_1" data-parent="#job_list___sub_accordion_648" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_648_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=599" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (599, 15), end pos: (599, 24)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 22</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -596,7 +596,7 @@ ), {"id": document_id, "uid": int(g.user["id"])}, ).first() - except Exception: + except CosmicRayTestingException: app.logger.error( f"Database error in get_document: {document_id},{g.user['id']}" )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.22s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_649"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_649_1" aria-expanded="false" aria-controls="job_list___sub_collapse_649_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_649_1"><button class="btn btn-outline-danger"><span class="job_id">649 : Job ID 645355a2f5234239a0d540c98b5fd071</span></button></div></a><div aria-labelledby="job_list___sub_heading_649_1" data-parent="#job_list___sub_accordion_649" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_649_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=622" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (622, 15), end pos: (622, 24)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 23</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -619,7 +619,7 @@ try: resolved = file_path.resolve() resolved.relative_to(storage_root) - except Exception: + except CosmicRayTestingException: # Path looks suspicious or outside storage app.logger.warning( "Rejected document path for id %s: %s", document_id, row.path</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.24s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_650"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_650_1" aria-expanded="false" aria-controls="job_list___sub_collapse_650_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_650_1"><button class="btn btn-outline-danger"><span class="job_id">650 : Job ID 4625813b7d6d47bd8d6f84edd166dbad</span></button></div></a><div aria-labelledby="job_list___sub_heading_650_1" data-parent="#job_list___sub_accordion_650" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_650_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=636" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (636, 15), end pos: (636, 22)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 24</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -633,7 +633,7 @@ # TOCTOU-safe open and validation try: f = open(resolved, "rb") - except OSError: + except CosmicRayTestingException: app.logger.error("File missing on disk for document id=%s", document_id) return jsonify({"error": "file missing on disk"}), 410 </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.17s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_651"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_651_1" aria-expanded="false" aria-controls="job_list___sub_collapse_651_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_651_1"><button class="btn btn-outline-success"><span class="job_id">651 : Job ID 670a99baafbc4ff28d755d143f6d314d</span></button></div></a><div aria-labelledby="job_list___sub_heading_651_1" data-parent="#job_list___sub_accordion_651" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_651_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=684" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (684, 15), end pos: (684, 24)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 25</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -681,7 +681,7 @@ ) return resp - except Exception as e: + except CosmicRayTestingException as e: f.close() # Log error and return generic message app.logger.error(</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T235158263733Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T235159147429Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.30s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_652"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_652_1" aria-expanded="false" aria-controls="job_list___sub_collapse_652_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_652_1"><button class="btn btn-outline-danger"><span class="job_id">652 : Job ID e2504bb4f92043d78e2c70ded5ab0400</span></button></div></a><div aria-labelledby="job_list___sub_heading_652_1" data-parent="#job_list___sub_accordion_652" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_652_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=713" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (713, 15), end pos: (713, 24)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 26</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -710,7 +710,7 @@ ), {"link": link}, ).first() - except Exception as e: + except CosmicRayTestingException as e: app.logger.error("Database error in get_version: %s", e) inc_db_error("get_version") return jsonify({"error": "database error"}), 503</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.23s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_653"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_653_1" aria-expanded="false" aria-controls="job_list___sub_collapse_653_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_653_1"><button class="btn btn-outline-danger"><span class="job_id">653 : Job ID 0420373f12bd44fba9029bfd314761a0</span></button></div></a><div aria-labelledby="job_list___sub_heading_653_1" data-parent="#job_list___sub_accordion_653" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_653_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=724" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (724, 15), end pos: (724, 24)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 27</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -721,7 +721,7 @@ try: resolved = _safe_resolve_under_storage(row.path, app.config["STORAGE_DIR"]) - except Exception as exc: + except CosmicRayTestingException as exc: app.logger.warning( "Rejected version path for link %s: %s (%s)", link, row.path, exc )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.14s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_654"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_654_1" aria-expanded="false" aria-controls="job_list___sub_collapse_654_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_654_1"><button class="btn btn-outline-danger"><span class="job_id">654 : Job ID bf02a7da88604c5886735b987c6ea909</span></button></div></a><div aria-labelledby="job_list___sub_heading_654_1" data-parent="#job_list___sub_accordion_654" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_654_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=744" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (744, 15), end pos: (744, 22)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 28</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -741,7 +741,7 @@ return jsonify({"error": "document not available"}), 415 fh.seek(0) last_modified = os.fstat(fh.fileno()).st_mtime - except OSError: + except CosmicRayTestingException: app.logger.error("File missing on disk for version link=%s", link) return jsonify({"error": "file missing on disk"}), 410 except Exception as e:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.16s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_655"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_655_1" aria-expanded="false" aria-controls="job_list___sub_collapse_655_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_655_1"><button class="btn btn-outline-danger"><span class="job_id">655 : Job ID 5ad2d203a03344cc87d53ba3b6f526e4</span></button></div></a><div aria-labelledby="job_list___sub_heading_655_1" data-parent="#job_list___sub_accordion_655" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_655_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=747" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (747, 15), end pos: (747, 24)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 29</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -744,7 +744,7 @@ except OSError: app.logger.error("File missing on disk for version link=%s", link) return jsonify({"error": "file missing on disk"}), 410 - except Exception as e: + except CosmicRayTestingException as e: app.logger.error("Error inspecting version file for %s: %s", link, e) return jsonify({"error": "error serving file"}), 500 </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.22s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_656"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_656_1" aria-expanded="false" aria-controls="job_list___sub_collapse_656_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_656_1"><button class="btn btn-outline-danger"><span class="job_id">656 : Job ID e46e2cda3ff340fca22b1d0689c2b58f</span></button></div></a><div aria-labelledby="job_list___sub_heading_656_1" data-parent="#job_list___sub_accordion_656" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_656_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=766" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (766, 15), end pos: (766, 24)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 30</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -763,7 +763,7 @@ max_age=0, last_modified=last_modified, ) - except Exception as e: + except CosmicRayTestingException as e: app.logger.error("Error serving version %s: %s", link, e) return jsonify({"error": "error serving file"}), 500 </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.09s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_657"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_657_1" aria-expanded="false" aria-controls="job_list___sub_collapse_657_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_657_1"><button class="btn btn-outline-danger"><span class="job_id">657 : Job ID 1c9ece62c3da41ba908724a7186dddec</span></button></div></a><div aria-labelledby="job_list___sub_heading_657_1" data-parent="#job_list___sub_accordion_657" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_657_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=794" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (794, 19), end pos: (794, 29)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 31</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -791,7 +791,7 @@ else: try: fp.relative_to(storage_root) - except ValueError: + except CosmicRayTestingException: raise RuntimeError( f"path {fp} escapes storage root {storage_root}" ) from None</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.04s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_658"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_658_1" aria-expanded="false" aria-controls="job_list___sub_collapse_658_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_658_1"><button class="btn btn-outline-success"><span class="job_id">658 : Job ID 87866d9cccf447e6ae7aa9b3df693ae5</span></button></div></a><div aria-labelledby="job_list___sub_heading_658_1" data-parent="#job_list___sub_accordion_658" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_658_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=819" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (819, 16), end pos: (819, 25)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 32</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -816,7 +816,7 @@ try: doc_id = int(document_id) - except (TypeError, ValueError): + except (CosmicRayTestingException, ValueError): app.logger.warning("Invalid document id for deletion: %s", document_id) return jsonify({"error": "document id required"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T140942720599Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T140943747891Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 20.53s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_659"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_659_1" aria-expanded="false" aria-controls="job_list___sub_collapse_659_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_659_1"><button class="btn btn-outline-danger"><span class="job_id">659 : Job ID cae313077cd14445822ebb6569574af3</span></button></div></a><div aria-labelledby="job_list___sub_heading_659_1" data-parent="#job_list___sub_accordion_659" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_659_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=819" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (819, 27), end pos: (819, 37)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 33</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -816,7 +816,7 @@ try: doc_id = int(document_id) - except (TypeError, ValueError): + except (TypeError, CosmicRayTestingException): app.logger.warning("Invalid document id for deletion: %s", document_id) return jsonify({"error": "document id required"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.45s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_660"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_660_1" aria-expanded="false" aria-controls="job_list___sub_collapse_660_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_660_1"><button class="btn btn-outline-danger"><span class="job_id">660 : Job ID e461eb7df0a44eeca4332bff535b7f20</span></button></div></a><div aria-labelledby="job_list___sub_heading_660_1" data-parent="#job_list___sub_accordion_660" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_660_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=843" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (843, 15), end pos: (843, 24)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 34</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -840,7 +840,7 @@ ), {"id": doc_id, "owner": owner_id}, ).first() - except Exception as e: + except CosmicRayTestingException as e: app.logger.error("DB delete error for doc id=%s: %s", doc_id, e) inc_db_error("delete_document_select") return jsonify({"error": "database error during delete"}), 503</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.73s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_661"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_661_1" aria-expanded="false" aria-controls="job_list___sub_collapse_661_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_661_1"><button class="btn btn-outline-danger"><span class="job_id">661 : Job ID 2bf52ede8f5c4489b097f8e6bb1ebe8f</span></button></div></a><div aria-labelledby="job_list___sub_heading_661_1" data-parent="#job_list___sub_accordion_661" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_661_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=866" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (866, 23), end pos: (866, 32)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 35</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -863,7 +863,7 @@ try: fp.unlink() file_deleted = True - except Exception as e: + except CosmicRayTestingException as e: delete_error = f"failed to delete file: {e}" app.logger.warning( "Failed to delete file %s for doc id=%s: %s", fp, row.id, e</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.29s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_662"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_662_1" aria-expanded="false" aria-controls="job_list___sub_collapse_662_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_662_1"><button class="btn btn-outline-success"><span class="job_id">662 : Job ID 9e6e495810a54053a9baca8d1d2da137</span></button></div></a><div aria-labelledby="job_list___sub_heading_662_1" data-parent="#job_list___sub_accordion_662" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_662_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=873" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (873, 15), end pos: (873, 27)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 36</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -870,7 +870,7 @@ ) else: file_missing = True - except RuntimeError as e: + except CosmicRayTestingException as e: # Path escapes storage root; refuse to touch the file delete_error = str(e) app.logger.error("Path safety check failed for doc id=%s: %s", row.id, e)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T173208265515Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T173209183503Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.35s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_663"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_663_1" aria-expanded="false" aria-controls="job_list___sub_collapse_663_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_663_1"><button class="btn btn-outline-danger"><span class="job_id">663 : Job ID d0a8b25e01ab4374a3d81d0b8096c4c4</span></button></div></a><div aria-labelledby="job_list___sub_heading_663_1" data-parent="#job_list___sub_accordion_663" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_663_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=889" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (889, 15), end pos: (889, 24)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 37</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -886,7 +886,7 @@ text("DELETE FROM Documents WHERE id = :id AND ownerid = :owner"), {"id": doc_id, "owner": owner_id}, ) - except Exception as e: + except CosmicRayTestingException as e: app.logger.error("DB delete error for doc id=%s: %s", doc_id, e) inc_db_error("delete_document_delete") return jsonify({"error": "database error during delete"}), 503</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.32s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_664"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_664_1" aria-expanded="false" aria-controls="job_list___sub_collapse_664_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_664_1"><button class="btn btn-outline-success"><span class="job_id">664 : Job ID 2c874ffe9b524b7f9d08b50a0eb8e66e</span></button></div></a><div aria-labelledby="job_list___sub_heading_664_1" data-parent="#job_list___sub_accordion_664" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_664_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=919" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (919, 16), end pos: (919, 25)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 38</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -916,7 +916,7 @@ ) try: doc_id = document_id - except (TypeError, ValueError): + except (CosmicRayTestingException, ValueError): app.logger.warning("Invalid document id in query: %s", document_id) return jsonify({"error": "document id required"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T061116137476Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T061117184046Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 21.46s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_665"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_665_1" aria-expanded="false" aria-controls="job_list___sub_collapse_665_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_665_1"><button class="btn btn-outline-success"><span class="job_id">665 : Job ID 40af629d20004f34ae7e81efba96248c</span></button></div></a><div aria-labelledby="job_list___sub_heading_665_1" data-parent="#job_list___sub_accordion_665" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_665_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=919" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (919, 27), end pos: (919, 37)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 39</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -916,7 +916,7 @@ ) try: doc_id = document_id - except (TypeError, ValueError): + except (TypeError, CosmicRayTestingException): app.logger.warning("Invalid document id in query: %s", document_id) return jsonify({"error": "document id required"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 4 failed, 10 passed, 22 warnings in 22.19s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_666"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_666_1" aria-expanded="false" aria-controls="job_list___sub_collapse_666_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_666_1"><button class="btn btn-outline-danger"><span class="job_id">666 : Job ID 1441378dd1d540478a148b26cb825cb0</span></button></div></a><div aria-labelledby="job_list___sub_heading_666_1" data-parent="#job_list___sub_accordion_666" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_666_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=939" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (939, 16), end pos: (939, 25)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 40</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -936,7 +936,7 @@ doc_id = int(doc_id) if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 - except (TypeError, ValueError): + except (CosmicRayTestingException, ValueError): app.logger.warning("Invalid document id: %s", document_id) return jsonify({"error": "document_id (int) is required"}), 400 if (</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.99s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_667"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_667_1" aria-expanded="false" aria-controls="job_list___sub_collapse_667_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_667_1"><button class="btn btn-outline-danger"><span class="job_id">667 : Job ID 4487e286e6f446398da5d255f3040992</span></button></div></a><div aria-labelledby="job_list___sub_heading_667_1" data-parent="#job_list___sub_accordion_667" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_667_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=939" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (939, 27), end pos: (939, 37)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 41</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -936,7 +936,7 @@ doc_id = int(doc_id) if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 - except (TypeError, ValueError): + except (TypeError, CosmicRayTestingException): app.logger.warning("Invalid document id: %s", document_id) return jsonify({"error": "document_id (int) is required"}), 400 if (</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.10s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_668"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_668_1" aria-expanded="false" aria-controls="job_list___sub_collapse_668_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_668_1"><button class="btn btn-outline-danger"><span class="job_id">668 : Job ID 4730ced6548842929bd0ed8b601264de</span></button></div></a><div aria-labelledby="job_list___sub_heading_668_1" data-parent="#job_list___sub_accordion_668" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_668_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=967" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (967, 15), end pos: (967, 24)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 42</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -964,7 +964,7 @@ ), {"id": doc_id, "owner": int(g.user["id"])}, ).first() - except Exception as e: + except CosmicRayTestingException as e: app.logger.error("Database error fetching document %s", e) return jsonify({"error": "database error"}), 503 </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.92s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_669"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_669_1" aria-expanded="false" aria-controls="job_list___sub_collapse_669_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_669_1"><button class="btn btn-outline-danger"><span class="job_id">669 : Job ID 416df53adf9b41819ed2dcd0d7f41d22</span></button></div></a><div aria-labelledby="job_list___sub_heading_669_1" data-parent="#job_list___sub_accordion_669" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_669_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=985" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (985, 15), end pos: (985, 25)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 43</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -982,7 +982,7 @@ file_path = file_path.resolve() try: file_path.relative_to(storage_root) - except ValueError: + except CosmicRayTestingException: app.logger.warning("Rejected document path for id %s: %s", doc_id, row.path) return jsonify({"error": "document path invalid"}), 500 if not file_path.exists():</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.99s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_670"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_670_1" aria-expanded="false" aria-controls="job_list___sub_collapse_670_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_670_1"><button class="btn btn-outline-success"><span class="job_id">670 : Job ID fb770630938f46389dbcce73735a2f11</span></button></div></a><div aria-labelledby="job_list___sub_heading_670_1" data-parent="#job_list___sub_accordion_670" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_670_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1005" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1005, 15), end pos: (1005, 24)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 44</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1002,7 +1002,7 @@ doc_id, ) return jsonify({"error": "watermarking method not applicable"}), 400 - except Exception as e: + except CosmicRayTestingException as e: inc_watermark_failed(method, "applicability_exception") app.logger.error( "Watermark applicability check failed for document %s: %s", doc_id, e</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ method = 'watermarkmethod' def get_method(method: str | WatermarkingMethod) -&gt; WatermarkingMethod: """Resolve a method from a string name or pass-through an instance. Raises ------ KeyError If ``method`` is a string not present in :data:`METHODS`. """ if isinstance(method, WatermarkingMethod): return method try: &gt; return METHODS[method] ^^^^^^^^^^^^^^^ E KeyError: 'watermarkmethod' watermarking_utils.py:79: KeyError The above exception was the direct cause of the following exception: document_id = 1 @app.post("/api/create-watermark") @app.post("/api/create-watermark/&lt;int:document_id&gt;") @require_auth def create_watermark(document_id: int | None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on GET if not document_id: document_id = ( request.args.get("id") or request.args.get("documentid") or (request.is_json and (request.get_json(silent=True) or {}).get("id")) ) try: doc_id = document_id except (TypeError, ValueError): app.logger.warning("Invalid document id in query: %s", document_id) return jsonify({"error": "document id required"}), 400 payload = request.get_json(silent=True) or {} # allow a couple of aliases for convenience method = payload.get("method") intended_for = payload.get("intended_for") position = payload.get("position") or None secret = payload.get("secret") key = payload.get("key") # validate input try: if doc_id is None: app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id) return jsonify({"error": "document_id (int) is required"}), 400 if ( not method or not intended_for or not isinstance(secret, str) or not isinstance(key, str) ): app.logger.warning("Missing required fields for watermarking: %s", payload) return jsonify( {"error": "method, intended_for, secret, and key are required"} ), 400 # lookup the document; enforce ownership try: with get_engine().connect() as conn: row = conn.execute( text( """ SELECT id, name, path FROM Documents WHERE id = :id AND ownerid = :owner LIMIT 1 """ ), {"id": doc_id, "owner": int(g.user["id"])}, ).first() except Exception as e: app.logger.error("Database error fetching document %s", e) return jsonify({"error": "database error"}), 503 if not row: app.logger.warning( "Document not found or access denied for watermarking id=%s", doc_id ) return jsonify({"error": "document not found"}), 404 # resolve path safely under STORAGE_DIR storage_root = Path(app.config["STORAGE_DIR"]).resolve() file_path = Path(row.path) if not file_path.is_absolute(): file_path = storage_root / file_path file_path = file_path.resolve() try: file_path.relative_to(storage_root) except ValueError: app.logger.warning("Rejected document path for id %s: %s", doc_id, row.path) return jsonify({"error": "document path invalid"}), 500 if not file_path.exists(): app.logger.error("File missing on disk for document id=%s", doc_id) return jsonify({"error": "file missing on disk"}), 410 # check watermark applicability try: &gt; applicable = WMUtils.is_watermarking_applicable( method=method, pdf=str(file_path), position=position ) server.py:994: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ watermarking_utils.py:112: in is_watermarking_applicable m = get_method(method) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ method = 'watermarkmethod' def get_method(method: str | WatermarkingMethod) -&gt; WatermarkingMethod: """Resolve a method from a string name or pass-through an instance. Raises ------ KeyError If ``method`` is a string not present in :data:`METHODS`. """ if isinstance(method, WatermarkingMethod): return method try: return METHODS[method] except KeyError as exc: &gt; raise KeyError( f"Unknown watermarking method: {method!r}. Known: {sorted(METHODS)}" ) from exc E KeyError: "Unknown watermarking method: 'watermarkmethod'. Known: ['overlay-watermark', 'robust-xmp', 'signed-annots']" watermarking_utils.py:81: KeyError During handling of the above exception, another exception occurred: client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("id"), int) assert isinstance(data.get("documentid"), int) assert isinstance(data.get("link"), str) assert isinstance(data.get("intended_for"), str) assert isinstance(data.get("method"), str) assert isinstance(data.get("position"), str) assert isinstance(data.get("filename"), str) assert isinstance(data.get("size"), int) #check values assert data.get("documentid") == parameters["id"] assert data.get("intended_for") == parameters["intended_for"] assert data.get("method") == parameters["method"] assert data.get("position") == parameters["position"] #Tests with wrong parameters #Test with exact same call: should return database insertion error (Non unique entry) resp = client.post("/api/create-watermark", json=parameters) assert resp.status_code == 503 #Non existant method &gt; resp = client.post("/api/create-watermark", json={"method": "watermarkmethod", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) ..\test\test_api.py:344: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ document_id = 1 @app.post("/api/create-watermark") @app.post("/api/create-watermark/&lt;int:document_id&gt;") @require_auth def create_watermark(document_id: int | None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on GET if not document_id: document_id = ( request.args.get("id") or request.args.get("documentid") or (request.is_json and (request.get_json(silent=True) or {}).get("id")) ) try: doc_id = document_id except (TypeError, ValueError): app.logger.warning("Invalid document id in query: %s", document_id) return jsonify({"error": "document id required"}), 400 payload = request.get_json(silent=True) or {} # allow a couple of aliases for convenience method = payload.get("method") intended_for = payload.get("intended_for") position = payload.get("position") or None secret = payload.get("secret") key = payload.get("key") # validate input try: if doc_id is None: app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id) return jsonify({"error": "document_id (int) is required"}), 400 if ( not method or not intended_for or not isinstance(secret, str) or not isinstance(key, str) ): app.logger.warning("Missing required fields for watermarking: %s", payload) return jsonify( {"error": "method, intended_for, secret, and key are required"} ), 400 # lookup the document; enforce ownership try: with get_engine().connect() as conn: row = conn.execute( text( """ SELECT id, name, path FROM Documents WHERE id = :id AND ownerid = :owner LIMIT 1 """ ), {"id": doc_id, "owner": int(g.user["id"])}, ).first() except Exception as e: app.logger.error("Database error fetching document %s", e) return jsonify({"error": "database error"}), 503 if not row: app.logger.warning( "Document not found or access denied for watermarking id=%s", doc_id ) return jsonify({"error": "document not found"}), 404 # resolve path safely under STORAGE_DIR storage_root = Path(app.config["STORAGE_DIR"]).resolve() file_path = Path(row.path) if not file_path.is_absolute(): file_path = storage_root / file_path file_path = file_path.resolve() try: file_path.relative_to(storage_root) except ValueError: app.logger.warning("Rejected document path for id %s: %s", doc_id, row.path) return jsonify({"error": "document path invalid"}), 500 if not file_path.exists(): app.logger.error("File missing on disk for document id=%s", doc_id) return jsonify({"error": "file missing on disk"}), 410 # check watermark applicability try: applicable = WMUtils.is_watermarking_applicable( method=method, pdf=str(file_path), position=position ) if applicable is False: inc_watermark_failed(method, "applicability") app.logger.info( "Watermarking method %s not applicable for document %s", method, doc_id, ) return jsonify({"error": "watermarking method not applicable"}), 400 &gt; except CosmicRayTestingException as e: ^^^^^^^^^^^^^^^^^^^^^^^^^ E NameError: name 'CosmicRayTestingException' is not defined server.py:1005: NameError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1097 Integrity error during version insert for document 1: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b' for key 'uq_Versions_link'") [SQL: INSERT INTO Versions (documentid, link, intended_for, secret, method, position, path) VALUES (%(documentid)s, %(link)s, %(intended_for)s, %(secret)s, %(method)s, %(position)s, %(path)s) ] [parameters: {'documentid': 1, 'link': 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b', 'intended_for': 'Mickey Mouse', 'secret': 'secret', 'method': 'robust-xmp', 'position': 'metadata-only', 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username\\watermarks\\My File__Mickey_Mouse.pdf'}] (Background on this error at: https://sqlalche.me/e/20/gkpj) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - NameError: name 'Co... 1 failed, 13 passed, 22 warnings in 20.80s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_671"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_671_1" aria-expanded="false" aria-controls="job_list___sub_collapse_671_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_671_1"><button class="btn btn-outline-success"><span class="job_id">671 : Job ID 596ded22a5304c689812ddbf35af2aa0</span></button></div></a><div aria-labelledby="job_list___sub_heading_671_1" data-parent="#job_list___sub_accordion_671" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_671_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1032" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1032, 15), end pos: (1032, 24)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 45</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1029,7 +1029,7 @@ method, ) return jsonify({"error": "watermarking produced no output"}), 500 - except Exception as e: + except CosmicRayTestingException as e: inc_watermark_failed(method, "exception") app.logger.error( "Watermarking failed for document %s using method %s: %s",</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e35662a3600e8b7eb: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 20.91s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_672"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_672_1" aria-expanded="false" aria-controls="job_list___sub_collapse_672_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_672_1"><button class="btn btn-outline-success"><span class="job_id">672 : Job ID dd209e2663714086bd2d30fc0058994d</span></button></div></a><div aria-labelledby="job_list___sub_heading_672_1" data-parent="#job_list___sub_accordion_672" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_672_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1055" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1055, 15), end pos: (1055, 24)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 46</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1052,7 +1052,7 @@ try: with dest_path.open("wb") as f: f.write(wm_bytes) - except Exception as e: + except CosmicRayTestingException as e: app.logger.error( "Failed to write watermarked file %s for document %s: %s", dest_path,</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ document_id = 1 @app.post("/api/create-watermark") @app.post("/api/create-watermark/&lt;int:document_id&gt;") @require_auth def create_watermark(document_id: int | None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on GET if not document_id: document_id = ( request.args.get("id") or request.args.get("documentid") or (request.is_json and (request.get_json(silent=True) or {}).get("id")) ) try: doc_id = document_id except (TypeError, ValueError): app.logger.warning("Invalid document id in query: %s", document_id) return jsonify({"error": "document id required"}), 400 payload = request.get_json(silent=True) or {} # allow a couple of aliases for convenience method = payload.get("method") intended_for = payload.get("intended_for") position = payload.get("position") or None secret = payload.get("secret") key = payload.get("key") # validate input try: if doc_id is None: app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id) return jsonify({"error": "document_id (int) is required"}), 400 if ( not method or not intended_for or not isinstance(secret, str) or not isinstance(key, str) ): app.logger.warning("Missing required fields for watermarking: %s", payload) return jsonify( {"error": "method, intended_for, secret, and key are required"} ), 400 # lookup the document; enforce ownership try: with get_engine().connect() as conn: row = conn.execute( text( """ SELECT id, name, path FROM Documents WHERE id = :id AND ownerid = :owner LIMIT 1 """ ), {"id": doc_id, "owner": int(g.user["id"])}, ).first() except Exception as e: app.logger.error("Database error fetching document %s", e) return jsonify({"error": "database error"}), 503 if not row: app.logger.warning( "Document not found or access denied for watermarking id=%s", doc_id ) return jsonify({"error": "document not found"}), 404 # resolve path safely under STORAGE_DIR storage_root = Path(app.config["STORAGE_DIR"]).resolve() file_path = Path(row.path) if not file_path.is_absolute(): file_path = storage_root / file_path file_path = file_path.resolve() try: file_path.relative_to(storage_root) except ValueError: app.logger.warning("Rejected document path for id %s: %s", doc_id, row.path) return jsonify({"error": "document path invalid"}), 500 if not file_path.exists(): app.logger.error("File missing on disk for document id=%s", doc_id) return jsonify({"error": "file missing on disk"}), 410 # check watermark applicability try: applicable = WMUtils.is_watermarking_applicable( method=method, pdf=str(file_path), position=position ) if applicable is False: inc_watermark_failed(method, "applicability") app.logger.info( "Watermarking method %s not applicable for document %s", method, doc_id, ) return jsonify({"error": "watermarking method not applicable"}), 400 except Exception as e: inc_watermark_failed(method, "applicability_exception") app.logger.error( "Watermark applicability check failed for document %s: %s", doc_id, e ) return jsonify({"error": "watermark applicability check failed"}), 400 # apply watermark  bytes try: _wm_start = time.time() wm_bytes: bytes = WMUtils.apply_watermark( pdf=str(file_path), secret=secret, key=key, method=method, intended_for=intended_for, position=position, ) observe_watermark_duration(method, time.time() - _wm_start) if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: inc_watermark_failed(method, "empty_output") app.logger.error( "Watermarking produced no output for document %s using method %s", doc_id, method, ) return jsonify({"error": "watermarking produced no output"}), 500 except Exception as e: inc_watermark_failed(method, "exception") app.logger.error( "Watermarking failed for document %s using method %s: %s", doc_id, method, e, ) return jsonify({"error": "watermarking failed"}), 500 # build destination file name: "&lt;original_name&gt;__&lt;intended_to&gt;.pdf" base_name = Path(row.name or file_path.name).stem intended_slug = secure_filename(intended_for) dest_dir = file_path.parent / "watermarks" dest_dir.mkdir(parents=True, exist_ok=True) candidate = f"{base_name}__{intended_slug}.pdf" dest_path = dest_dir / candidate # write bytes try: with dest_path.open("wb") as f: &gt; f.write(wm_bytes) E OSError: [Errno 28] No space left on device server.py:1054: OSError During handling of the above exception, another exception occurred: client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} &gt; resp = client.post("/api/create-watermark", json=parameters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:317: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ document_id = 1 @app.post("/api/create-watermark") @app.post("/api/create-watermark/&lt;int:document_id&gt;") @require_auth def create_watermark(document_id: int | None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on GET if not document_id: document_id = ( request.args.get("id") or request.args.get("documentid") or (request.is_json and (request.get_json(silent=True) or {}).get("id")) ) try: doc_id = document_id except (TypeError, ValueError): app.logger.warning("Invalid document id in query: %s", document_id) return jsonify({"error": "document id required"}), 400 payload = request.get_json(silent=True) or {} # allow a couple of aliases for convenience method = payload.get("method") intended_for = payload.get("intended_for") position = payload.get("position") or None secret = payload.get("secret") key = payload.get("key") # validate input try: if doc_id is None: app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id) return jsonify({"error": "document_id (int) is required"}), 400 if ( not method or not intended_for or not isinstance(secret, str) or not isinstance(key, str) ): app.logger.warning("Missing required fields for watermarking: %s", payload) return jsonify( {"error": "method, intended_for, secret, and key are required"} ), 400 # lookup the document; enforce ownership try: with get_engine().connect() as conn: row = conn.execute( text( """ SELECT id, name, path FROM Documents WHERE id = :id AND ownerid = :owner LIMIT 1 """ ), {"id": doc_id, "owner": int(g.user["id"])}, ).first() except Exception as e: app.logger.error("Database error fetching document %s", e) return jsonify({"error": "database error"}), 503 if not row: app.logger.warning( "Document not found or access denied for watermarking id=%s", doc_id ) return jsonify({"error": "document not found"}), 404 # resolve path safely under STORAGE_DIR storage_root = Path(app.config["STORAGE_DIR"]).resolve() file_path = Path(row.path) if not file_path.is_absolute(): file_path = storage_root / file_path file_path = file_path.resolve() try: file_path.relative_to(storage_root) except ValueError: app.logger.warning("Rejected document path for id %s: %s", doc_id, row.path) return jsonify({"error": "document path invalid"}), 500 if not file_path.exists(): app.logger.error("File missing on disk for document id=%s", doc_id) return jsonify({"error": "file missing on disk"}), 410 # check watermark applicability try: applicable = WMUtils.is_watermarking_applicable( method=method, pdf=str(file_path), position=position ) if applicable is False: inc_watermark_failed(method, "applicability") app.logger.info( "Watermarking method %s not applicable for document %s", method, doc_id, ) return jsonify({"error": "watermarking method not applicable"}), 400 except Exception as e: inc_watermark_failed(method, "applicability_exception") app.logger.error( "Watermark applicability check failed for document %s: %s", doc_id, e ) return jsonify({"error": "watermark applicability check failed"}), 400 # apply watermark  bytes try: _wm_start = time.time() wm_bytes: bytes = WMUtils.apply_watermark( pdf=str(file_path), secret=secret, key=key, method=method, intended_for=intended_for, position=position, ) observe_watermark_duration(method, time.time() - _wm_start) if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: inc_watermark_failed(method, "empty_output") app.logger.error( "Watermarking produced no output for document %s using method %s", doc_id, method, ) return jsonify({"error": "watermarking produced no output"}), 500 except Exception as e: inc_watermark_failed(method, "exception") app.logger.error( "Watermarking failed for document %s using method %s: %s", doc_id, method, e, ) return jsonify({"error": "watermarking failed"}), 500 # build destination file name: "&lt;original_name&gt;__&lt;intended_to&gt;.pdf" base_name = Path(row.name or file_path.name).stem intended_slug = secure_filename(intended_for) dest_dir = file_path.parent / "watermarks" dest_dir.mkdir(parents=True, exist_ok=True) candidate = f"{base_name}__{intended_slug}.pdf" dest_path = dest_dir / candidate # write bytes try: with dest_path.open("wb") as f: f.write(wm_bytes) &gt; except CosmicRayTestingException as e: ^^^^^^^^^^^^^^^^^^^^^^^^^ E NameError: name 'CosmicRayTestingException' is not defined server.py:1055: NameError __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e79c08b104483925c: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - NameError: name 'Co... FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 20.66s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_673"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_673_1" aria-expanded="false" aria-controls="job_list___sub_collapse_673_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_673_1"><button class="btn btn-outline-success"><span class="job_id">673 : Job ID 554f4be5edb2432b87a3935f2c86e403</span></button></div></a><div aria-labelledby="job_list___sub_heading_673_1" data-parent="#job_list___sub_accordion_673" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_673_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1089" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1089, 15), end pos: (1089, 29)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 47</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1086,7 +1086,7 @@ }, ) vid = int(conn.execute(text("SELECT LAST_INSERT_ID()")).scalar()) - except IntegrityError as ie: + except CosmicRayTestingException as ie: # This should be very rare due to SHA-256 usage, but handle it just in case try: dest_path.unlink(missing_ok=True)</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ self = &lt;sqlalchemy.engine.base.Connection object at 0x00000235B9E95100&gt; dialect = &lt;sqlalchemy.dialects.mysql.pymysql.MySQLDialect_pymysql object at 0x00000235B9E1A090&gt; context = &lt;sqlalchemy.dialects.mysql.mysqldb.MySQLExecutionContext_mysqldb object at 0x00000235B9DD8440&gt; statement = &lt;sqlalchemy.dialects.mysql.mysqldb.MySQLCompiler_mysqldb object at 0x00000235B9E2BF80&gt; parameters = [{'documentid': 1, 'intended_for': 'Mickey Mouse', 'link': 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b', 'method': 'robust-xmp', ...}] def _exec_single_context( self, dialect: Dialect, context: ExecutionContext, statement: Union[str, Compiled], parameters: Optional[_AnyMultiExecuteParams], ) -&gt; CursorResult[Any]: """continue the _execute_context() method for a single DBAPI cursor.execute() or cursor.executemany() call. """ if dialect.bind_typing is BindTyping.SETINPUTSIZES: generic_setinputsizes = context._prepare_set_input_sizes() if generic_setinputsizes: try: dialect.do_set_input_sizes( context.cursor, generic_setinputsizes, context ) except BaseException as e: self._handle_dbapi_exception( e, str(statement), parameters, None, context ) cursor, str_statement, parameters = ( context.cursor, context.statement, context.parameters, ) effective_parameters: Optional[_AnyExecuteParams] if not context.executemany: effective_parameters = parameters[0] else: effective_parameters = parameters if self._has_events or self.engine._has_events: for fn in self.dispatch.before_cursor_execute: str_statement, effective_parameters = fn( self, cursor, str_statement, effective_parameters, context, context.executemany, ) if self._echo: self._log_info(str_statement) stats = context._get_cache_stats() if not self.engine.hide_parameters: self._log_info( "[%s] %r", stats, sql_util._repr_params( effective_parameters, batches=10, ismulti=context.executemany, ), ) else: self._log_info( "[%s] [SQL parameters hidden due to hide_parameters=True]", stats, ) evt_handled: bool = False try: if context.execute_style is ExecuteStyle.EXECUTEMANY: effective_parameters = cast( "_CoreMultiExecuteParams", effective_parameters ) if self.dialect._has_events: for fn in self.dialect.dispatch.do_executemany: if fn( cursor, str_statement, effective_parameters, context, ): evt_handled = True break if not evt_handled: self.dialect.do_executemany( cursor, str_statement, effective_parameters, context, ) elif not effective_parameters and context.no_parameters: if self.dialect._has_events: for fn in self.dialect.dispatch.do_execute_no_params: if fn(cursor, str_statement, context): evt_handled = True break if not evt_handled: self.dialect.do_execute_no_params( cursor, str_statement, context ) else: effective_parameters = cast( "_CoreSingleExecuteParams", effective_parameters ) if self.dialect._has_events: for fn in self.dialect.dispatch.do_execute: if fn( cursor, str_statement, effective_parameters, context, ): evt_handled = True break if not evt_handled: &gt; self.dialect.do_execute( cursor, str_statement, effective_parameters, context ) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:1967: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\default.py:951: in do_execute cursor.execute(statement, parameters) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\cursors.py:153: in execute result = self._query(query) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\cursors.py:322: in _query conn.query(q) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:575: in query self._affected_rows = self._read_query_result(unbuffered=unbuffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:826: in _read_query_result result.read() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:1203: in read first_packet = self.connection._read_packet() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:782: in _read_packet packet.raise_for_error() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\protocol.py:219: in raise_for_error err.raise_mysql_exception(self._data) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ data = b"\xff&amp;\x04#23000Duplicate entry 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b' for key 'uq_Versions_link'" def raise_mysql_exception(data): errno = struct.unpack("&lt;h", data[1:3])[0] # https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_basic_err_packet.html # Error packet has optional sqlstate that is 5 bytes and starts with '#'. if data[3] == 0x23: # '#' # sqlstate = data[4:9].decode() # TODO: Append (sqlstate) in the error message. This will be come in next minor release. errval = data[9:].decode("utf-8", "replace") else: errval = data[3:].decode("utf-8", "replace") errorclass = error_map.get(errno) if errorclass is None: errorclass = InternalError if errno &lt; 1000 else OperationalError &gt; raise errorclass(errno, errval) E pymysql.err.IntegrityError: (1062, "Duplicate entry 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b' for key 'uq_Versions_link'") C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\err.py:150: IntegrityError The above exception was the direct cause of the following exception: document_id = 1 @app.post("/api/create-watermark") @app.post("/api/create-watermark/&lt;int:document_id&gt;") @require_auth def create_watermark(document_id: int | None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on GET if not document_id: document_id = ( request.args.get("id") or request.args.get("documentid") or (request.is_json and (request.get_json(silent=True) or {}).get("id")) ) try: doc_id = document_id except (TypeError, ValueError): app.logger.warning("Invalid document id in query: %s", document_id) return jsonify({"error": "document id required"}), 400 payload = request.get_json(silent=True) or {} # allow a couple of aliases for convenience method = payload.get("method") intended_for = payload.get("intended_for") position = payload.get("position") or None secret = payload.get("secret") key = payload.get("key") # validate input try: if doc_id is None: app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id) return jsonify({"error": "document_id (int) is required"}), 400 if ( not method or not intended_for or not isinstance(secret, str) or not isinstance(key, str) ): app.logger.warning("Missing required fields for watermarking: %s", payload) return jsonify( {"error": "method, intended_for, secret, and key are required"} ), 400 # lookup the document; enforce ownership try: with get_engine().connect() as conn: row = conn.execute( text( """ SELECT id, name, path FROM Documents WHERE id = :id AND ownerid = :owner LIMIT 1 """ ), {"id": doc_id, "owner": int(g.user["id"])}, ).first() except Exception as e: app.logger.error("Database error fetching document %s", e) return jsonify({"error": "database error"}), 503 if not row: app.logger.warning( "Document not found or access denied for watermarking id=%s", doc_id ) return jsonify({"error": "document not found"}), 404 # resolve path safely under STORAGE_DIR storage_root = Path(app.config["STORAGE_DIR"]).resolve() file_path = Path(row.path) if not file_path.is_absolute(): file_path = storage_root / file_path file_path = file_path.resolve() try: file_path.relative_to(storage_root) except ValueError: app.logger.warning("Rejected document path for id %s: %s", doc_id, row.path) return jsonify({"error": "document path invalid"}), 500 if not file_path.exists(): app.logger.error("File missing on disk for document id=%s", doc_id) return jsonify({"error": "file missing on disk"}), 410 # check watermark applicability try: applicable = WMUtils.is_watermarking_applicable( method=method, pdf=str(file_path), position=position ) if applicable is False: inc_watermark_failed(method, "applicability") app.logger.info( "Watermarking method %s not applicable for document %s", method, doc_id, ) return jsonify({"error": "watermarking method not applicable"}), 400 except Exception as e: inc_watermark_failed(method, "applicability_exception") app.logger.error( "Watermark applicability check failed for document %s: %s", doc_id, e ) return jsonify({"error": "watermark applicability check failed"}), 400 # apply watermark  bytes try: _wm_start = time.time() wm_bytes: bytes = WMUtils.apply_watermark( pdf=str(file_path), secret=secret, key=key, method=method, intended_for=intended_for, position=position, ) observe_watermark_duration(method, time.time() - _wm_start) if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: inc_watermark_failed(method, "empty_output") app.logger.error( "Watermarking produced no output for document %s using method %s", doc_id, method, ) return jsonify({"error": "watermarking produced no output"}), 500 except Exception as e: inc_watermark_failed(method, "exception") app.logger.error( "Watermarking failed for document %s using method %s: %s", doc_id, method, e, ) return jsonify({"error": "watermarking failed"}), 500 # build destination file name: "&lt;original_name&gt;__&lt;intended_to&gt;.pdf" base_name = Path(row.name or file_path.name).stem intended_slug = secure_filename(intended_for) dest_dir = file_path.parent / "watermarks" dest_dir.mkdir(parents=True, exist_ok=True) candidate = f"{base_name}__{intended_slug}.pdf" dest_path = dest_dir / candidate # write bytes try: with dest_path.open("wb") as f: f.write(wm_bytes) except Exception as e: app.logger.error( "Failed to write watermarked file %s for document %s: %s", dest_path, doc_id, e, ) return jsonify({"error": "failed to write watermarked file"}), 500 # link token = sha256(watermarked_file_name) - using stronger hash link_token = hashlib.sha256(candidate.encode("utf-8")).hexdigest() try: with get_engine().begin() as conn: &gt; conn.execute( text( """ INSERT INTO Versions (documentid, link, intended_for, secret, method, position, path) VALUES (:documentid, :link, :intended_for, :secret, :method, :position, :path) """ ), { "documentid": doc_id, "link": link_token, "intended_for": intended_for, "secret": secret, "method": method, "position": position or "", "path": str(dest_path), }, ) server.py:1069: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:1419: in execute return meth( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\sql\elements.py:526: in _execute_on_connection return connection._execute_clauseelement( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:1641: in _execute_clauseelement ret = self._execute_context( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:1846: in _execute_context return self._exec_single_context( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:1986: in _exec_single_context self._handle_dbapi_exception( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:2355: in _handle_dbapi_exception raise sqlalchemy_exception.with_traceback(exc_info[2]) from e C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:1967: in _exec_single_context self.dialect.do_execute( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\default.py:951: in do_execute cursor.execute(statement, parameters) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\cursors.py:153: in execute result = self._query(query) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\cursors.py:322: in _query conn.query(q) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:575: in query self._affected_rows = self._read_query_result(unbuffered=unbuffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:826: in _read_query_result result.read() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:1203: in read first_packet = self.connection._read_packet() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:782: in _read_packet packet.raise_for_error() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\protocol.py:219: in raise_for_error err.raise_mysql_exception(self._data) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ data = b"\xff&amp;\x04#23000Duplicate entry 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b' for key 'uq_Versions_link'" def raise_mysql_exception(data): errno = struct.unpack("&lt;h", data[1:3])[0] # https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_basic_err_packet.html # Error packet has optional sqlstate that is 5 bytes and starts with '#'. if data[3] == 0x23: # '#' # sqlstate = data[4:9].decode() # TODO: Append (sqlstate) in the error message. This will be come in next minor release. errval = data[9:].decode("utf-8", "replace") else: errval = data[3:].decode("utf-8", "replace") errorclass = error_map.get(errno) if errorclass is None: errorclass = InternalError if errno &lt; 1000 else OperationalError &gt; raise errorclass(errno, errval) E sqlalchemy.exc.IntegrityError: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b' for key 'uq_Versions_link'") E [SQL: E INSERT INTO Versions (documentid, link, intended_for, E secret, method, position, path) E VALUES (%(documentid)s, %(link)s, %(intended_for)s, %(secret)s, E %(method)s, %(position)s, %(path)s) E ] E [parameters: {'documentid': 1, 'link': 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b', 'intended_for': 'Mickey Mouse', 'secret': 'secret', 'method': 'robust-xmp', 'position': 'metadata-only', 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username\\watermarks\\My File__Mickey_Mouse.pdf'}] E (Background on this error at: https://sqlalche.me/e/20/gkpj) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\err.py:150: IntegrityError During handling of the above exception, another exception occurred: client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("id"), int) assert isinstance(data.get("documentid"), int) assert isinstance(data.get("link"), str) assert isinstance(data.get("intended_for"), str) assert isinstance(data.get("method"), str) assert isinstance(data.get("position"), str) assert isinstance(data.get("filename"), str) assert isinstance(data.get("size"), int) #check values assert data.get("documentid") == parameters["id"] assert data.get("intended_for") == parameters["intended_for"] assert data.get("method") == parameters["method"] assert data.get("position") == parameters["position"] #Tests with wrong parameters #Test with exact same call: should return database insertion error (Non unique entry) &gt; resp = client.post("/api/create-watermark", json=parameters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:341: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ document_id = 1 @app.post("/api/create-watermark") @app.post("/api/create-watermark/&lt;int:document_id&gt;") @require_auth def create_watermark(document_id: int | None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on GET if not document_id: document_id = ( request.args.get("id") or request.args.get("documentid") or (request.is_json and (request.get_json(silent=True) or {}).get("id")) ) try: doc_id = document_id except (TypeError, ValueError): app.logger.warning("Invalid document id in query: %s", document_id) return jsonify({"error": "document id required"}), 400 payload = request.get_json(silent=True) or {} # allow a couple of aliases for convenience method = payload.get("method") intended_for = payload.get("intended_for") position = payload.get("position") or None secret = payload.get("secret") key = payload.get("key") # validate input try: if doc_id is None: app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id) return jsonify({"error": "document_id (int) is required"}), 400 if ( not method or not intended_for or not isinstance(secret, str) or not isinstance(key, str) ): app.logger.warning("Missing required fields for watermarking: %s", payload) return jsonify( {"error": "method, intended_for, secret, and key are required"} ), 400 # lookup the document; enforce ownership try: with get_engine().connect() as conn: row = conn.execute( text( """ SELECT id, name, path FROM Documents WHERE id = :id AND ownerid = :owner LIMIT 1 """ ), {"id": doc_id, "owner": int(g.user["id"])}, ).first() except Exception as e: app.logger.error("Database error fetching document %s", e) return jsonify({"error": "database error"}), 503 if not row: app.logger.warning( "Document not found or access denied for watermarking id=%s", doc_id ) return jsonify({"error": "document not found"}), 404 # resolve path safely under STORAGE_DIR storage_root = Path(app.config["STORAGE_DIR"]).resolve() file_path = Path(row.path) if not file_path.is_absolute(): file_path = storage_root / file_path file_path = file_path.resolve() try: file_path.relative_to(storage_root) except ValueError: app.logger.warning("Rejected document path for id %s: %s", doc_id, row.path) return jsonify({"error": "document path invalid"}), 500 if not file_path.exists(): app.logger.error("File missing on disk for document id=%s", doc_id) return jsonify({"error": "file missing on disk"}), 410 # check watermark applicability try: applicable = WMUtils.is_watermarking_applicable( method=method, pdf=str(file_path), position=position ) if applicable is False: inc_watermark_failed(method, "applicability") app.logger.info( "Watermarking method %s not applicable for document %s", method, doc_id, ) return jsonify({"error": "watermarking method not applicable"}), 400 except Exception as e: inc_watermark_failed(method, "applicability_exception") app.logger.error( "Watermark applicability check failed for document %s: %s", doc_id, e ) return jsonify({"error": "watermark applicability check failed"}), 400 # apply watermark  bytes try: _wm_start = time.time() wm_bytes: bytes = WMUtils.apply_watermark( pdf=str(file_path), secret=secret, key=key, method=method, intended_for=intended_for, position=position, ) observe_watermark_duration(method, time.time() - _wm_start) if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: inc_watermark_failed(method, "empty_output") app.logger.error( "Watermarking produced no output for document %s using method %s", doc_id, method, ) return jsonify({"error": "watermarking produced no output"}), 500 except Exception as e: inc_watermark_failed(method, "exception") app.logger.error( "Watermarking failed for document %s using method %s: %s", doc_id, method, e, ) return jsonify({"error": "watermarking failed"}), 500 # build destination file name: "&lt;original_name&gt;__&lt;intended_to&gt;.pdf" base_name = Path(row.name or file_path.name).stem intended_slug = secure_filename(intended_for) dest_dir = file_path.parent / "watermarks" dest_dir.mkdir(parents=True, exist_ok=True) candidate = f"{base_name}__{intended_slug}.pdf" dest_path = dest_dir / candidate # write bytes try: with dest_path.open("wb") as f: f.write(wm_bytes) except Exception as e: app.logger.error( "Failed to write watermarked file %s for document %s: %s", dest_path, doc_id, e, ) return jsonify({"error": "failed to write watermarked file"}), 500 # link token = sha256(watermarked_file_name) - using stronger hash link_token = hashlib.sha256(candidate.encode("utf-8")).hexdigest() try: with get_engine().begin() as conn: conn.execute( text( """ INSERT INTO Versions (documentid, link, intended_for, secret, method, position, path) VALUES (:documentid, :link, :intended_for, :secret, :method, :position, :path) """ ), { "documentid": doc_id, "link": link_token, "intended_for": intended_for, "secret": secret, "method": method, "position": position or "", "path": str(dest_path), }, ) vid = int(conn.execute(text("SELECT LAST_INSERT_ID()")).scalar()) &gt; except CosmicRayTestingException as ie: ^^^^^^^^^^^^^^^^^^^^^^^^^ E NameError: name 'CosmicRayTestingException' is not defined server.py:1089: NameError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - NameError: name 'Co... 1 failed, 13 passed, 22 warnings in 21.07s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_674"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_674_1" aria-expanded="false" aria-controls="job_list___sub_collapse_674_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_674_1"><button class="btn btn-outline-danger"><span class="job_id">674 : Job ID 8b975c115c5d4c18b4a02c9ccf46d47e</span></button></div></a><div aria-labelledby="job_list___sub_heading_674_1" data-parent="#job_list___sub_accordion_674" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_674_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1093" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1093, 19), end pos: (1093, 28)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 48</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1090,7 +1090,7 @@ # This should be very rare due to SHA-256 usage, but handle it just in case try: dest_path.unlink(missing_ok=True) - except Exception as cleanup_error: + except CosmicRayTestingException as cleanup_error: app.logger.warning( f"Failed to cleanup file {dest_path}: {cleanup_error}" )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.32s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_675"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_675_1" aria-expanded="false" aria-controls="job_list___sub_collapse_675_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_675_1"><button class="btn btn-outline-danger"><span class="job_id">675 : Job ID e27f9a8248b044bab7e6d1a2be2dae42</span></button></div></a><div aria-labelledby="job_list___sub_heading_675_1" data-parent="#job_list___sub_accordion_675" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_675_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1102" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1102, 15), end pos: (1102, 24)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 49</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1099,7 +1099,7 @@ ) inc_db_error("insert_version") return jsonify({"error": "database error during version insert"}), 503 - except Exception: + except CosmicRayTestingException: try: dest_path.unlink(missing_ok=True) except Exception as cleanup_error:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.47s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_676"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_676_1" aria-expanded="false" aria-controls="job_list___sub_collapse_676_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_676_1"><button class="btn btn-outline-success"><span class="job_id">676 : Job ID 4e4252bb6e264c86940e55e22223eb24</span></button></div></a><div aria-labelledby="job_list___sub_heading_676_1" data-parent="#job_list___sub_accordion_676" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_676_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1105" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1105, 19), end pos: (1105, 28)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 50</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1102,7 +1102,7 @@ except Exception: try: dest_path.unlink(missing_ok=True) - except Exception as cleanup_error: + except CosmicRayTestingException as cleanup_error: app.logger.warning( f"Failed to cleanup file {dest_path}: {cleanup_error}" )</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e3539ebb89404f67f: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 22.50s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_677"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_677_1" aria-expanded="false" aria-controls="job_list___sub_collapse_677_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_677_1"><button class="btn btn-outline-success"><span class="job_id">677 : Job ID 6d39fe333f60426395e2cfcb3770c24a</span></button></div></a><div aria-labelledby="job_list___sub_heading_677_1" data-parent="#job_list___sub_accordion_677" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_677_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1156" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1156, 16), end pos: (1156, 25)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 51</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1153,7 +1153,7 @@ ) try: doc_id = document_id - except (TypeError, ValueError): + except (CosmicRayTestingException, ValueError): app.logger.warning("Invalid document id in query: %s", document_id) return jsonify({"error": "document id required"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T004023041351Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T004023950110Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.27s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_678"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_678_1" aria-expanded="false" aria-controls="job_list___sub_collapse_678_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_678_1"><button class="btn btn-outline-success"><span class="job_id">678 : Job ID 0800840531dd47859ceada963348fff6</span></button></div></a><div aria-labelledby="job_list___sub_heading_678_1" data-parent="#job_list___sub_accordion_678" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_678_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1156" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1156, 27), end pos: (1156, 37)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 52</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1153,7 +1153,7 @@ ) try: doc_id = document_id - except (TypeError, ValueError): + except (TypeError, CosmicRayTestingException): app.logger.warning("Invalid document id in query: %s", document_id) return jsonify({"error": "document id required"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e02b77c873b6f7c77: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.69s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_679"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_679_1" aria-expanded="false" aria-controls="job_list___sub_collapse_679_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_679_1"><button class="btn btn-outline-success"><span class="job_id">679 : Job ID c331ae68915c4ad6ae51ab01d92fd727</span></button></div></a><div aria-labelledby="job_list___sub_heading_679_1" data-parent="#job_list___sub_accordion_679" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_679_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1174" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1174, 16), end pos: (1174, 25)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 53</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1171,7 +1171,7 @@ doc_id = int(doc_id) if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 - except (TypeError, ValueError): + except (CosmicRayTestingException, ValueError): app.logger.warning("Invalid document id: %s", document_id) return jsonify({"error": "document_id (int) is required"}), 400 if not method or not isinstance(method, str) or not isinstance(key, str):</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T013407801359Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T013408742024Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.49s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_680"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_680_1" aria-expanded="false" aria-controls="job_list___sub_collapse_680_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_680_1"><button class="btn btn-outline-danger"><span class="job_id">680 : Job ID ec9d7fca483f463fa13889ff32fe2fa6</span></button></div></a><div aria-labelledby="job_list___sub_heading_680_1" data-parent="#job_list___sub_accordion_680" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_680_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1174" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1174, 27), end pos: (1174, 37)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 54</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1171,7 +1171,7 @@ doc_id = int(doc_id) if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 - except (TypeError, ValueError): + except (TypeError, CosmicRayTestingException): app.logger.warning("Invalid document id: %s", document_id) return jsonify({"error": "document_id (int) is required"}), 400 if not method or not isinstance(method, str) or not isinstance(key, str):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.35s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_681"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_681_1" aria-expanded="false" aria-controls="job_list___sub_collapse_681_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_681_1"><button class="btn btn-outline-success"><span class="job_id">681 : Job ID f6bd330bd5564c46bb14ef67ab5587aa</span></button></div></a><div aria-labelledby="job_list___sub_heading_681_1" data-parent="#job_list___sub_accordion_681" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_681_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1195" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1195, 15), end pos: (1195, 24)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 55</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1192,7 +1192,7 @@ ), {"id": doc_id, "owner": int(g.user["id"])}, ).first() - except Exception as e: + except CosmicRayTestingException as e: app.logger.error( "Database error fetching document %s for watermark read: %s", doc_id, e )</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e826caa7c00bbc11e: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 20.81s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_682"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_682_1" aria-expanded="false" aria-controls="job_list___sub_collapse_682_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_682_1"><button class="btn btn-outline-success"><span class="job_id">682 : Job ID 0d871481a5e54c3fa3bc257922d0179c</span></button></div></a><div aria-labelledby="job_list___sub_heading_682_1" data-parent="#job_list___sub_accordion_682" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_682_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1215" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1215, 15), end pos: (1215, 25)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 56</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1212,7 +1212,7 @@ file_path = file_path.resolve() try: file_path.relative_to(storage_root) - except ValueError: + except CosmicRayTestingException: app.logger.warning("Rejected document path for id %s: %s", doc_id, row.path) return jsonify({"error": "document path invalid"}), 500 if not file_path.exists():</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%]</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_683"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_683_1" aria-expanded="false" aria-controls="job_list___sub_collapse_683_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_683_1"><button class="btn btn-outline-success"><span class="job_id">683 : Job ID f229abd1f28a49478da2ba13eda4c97e</span></button></div></a><div aria-labelledby="job_list___sub_heading_683_1" data-parent="#job_list___sub_accordion_683" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_683_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1225" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1225, 15), end pos: (1225, 24)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 57</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1222,7 +1222,7 @@ secret = None try: secret = WMUtils.read_watermark(method=method, pdf=str(file_path), key=key) - except Exception as e: + except CosmicRayTestingException as e: app.logger.error( "Error when attempting to read watermark for document %s: %s", doc_id, e )</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T015110997150Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T015111914604Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.33s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_684"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_684_1" aria-expanded="false" aria-controls="job_list___sub_collapse_684_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_684_1"><button class="btn btn-outline-danger"><span class="job_id">684 : Job ID 9f4b8e51737f4867ab5f3ebb3dcab0a2</span></button></div></a><div aria-labelledby="job_list___sub_heading_684_1" data-parent="#job_list___sub_accordion_684" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_684_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=34" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (34, 14), end pos: (34, 15)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -31,7 +31,7 @@ render_prometheus, ) -MAX_DB_INT = (2**63) - 1 +MAX_DB_INT = ( 3**63) - 1 RMAPHandler = None # default if not os.environ.get("TATOU_TEST_DISABLE_RMAP"):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.64s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_685"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_685_1" aria-expanded="false" aria-controls="job_list___sub_collapse_685_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_685_1"><button class="btn btn-outline-success"><span class="job_id">685 : Job ID 64650c75fbf74bc6834ce483f60a223d</span></button></div></a><div aria-labelledby="job_list___sub_heading_685_1" data-parent="#job_list___sub_accordion_685" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_685_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=34" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (34, 14), end pos: (34, 15)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -31,7 +31,7 @@ render_prometheus, ) -MAX_DB_INT = (2**63) - 1 +MAX_DB_INT = ( 1**63) - 1 RMAPHandler = None # default if not os.environ.get("TATOU_TEST_DISABLE_RMAP"):</pre></div><div class="alert alert-secondary"><pre class="diff">.....F.F.FFF.. [100%] ================================== FAILURES =================================== __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse 33 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:463 Invalid document id in query ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 42 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 42 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:400: AssertionError _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse streamed [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:824 Non-positive document id for deletion: 2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_list_versions_route - assert 400 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 400 == 200 5 failed, 9 passed, 22 warnings in 19.58s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_686"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_686_1" aria-expanded="false" aria-controls="job_list___sub_collapse_686_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_686_1"><button class="btn btn-outline-success"><span class="job_id">686 : Job ID 35b0a7a17ae1485db48b479a08306f5f</span></button></div></a><div aria-labelledby="job_list___sub_heading_686_1" data-parent="#job_list___sub_accordion_686" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_686_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=34" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (34, 17), end pos: (34, 19)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -31,7 +31,7 @@ render_prometheus, ) -MAX_DB_INT = (2**63) - 1 +MAX_DB_INT = (2** 64) - 1 RMAPHandler = None # default if not os.environ.get("TATOU_TEST_DISABLE_RMAP"):</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T000749690405Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T000750583155Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.42s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_687"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_687_1" aria-expanded="false" aria-controls="job_list___sub_collapse_687_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_687_1"><button class="btn btn-outline-danger"><span class="job_id">687 : Job ID 202533aa3c8742e6ae3b8f1737fd2fb9</span></button></div></a><div aria-labelledby="job_list___sub_heading_687_1" data-parent="#job_list___sub_accordion_687" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_687_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=34" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (34, 17), end pos: (34, 19)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -31,7 +31,7 @@ render_prometheus, ) -MAX_DB_INT = (2**63) - 1 +MAX_DB_INT = (2** 62) - 1 RMAPHandler = None # default if not os.environ.get("TATOU_TEST_DISABLE_RMAP"):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.06s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_688"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_688_1" aria-expanded="false" aria-controls="job_list___sub_collapse_688_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_688_1"><button class="btn btn-outline-danger"><span class="job_id">688 : Job ID 2f8c3ed9d77d4a76815aa449e1a26c30</span></button></div></a><div aria-labelledby="job_list___sub_heading_688_1" data-parent="#job_list___sub_accordion_688" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_688_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=34" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (34, 23), end pos: (34, 24)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -31,7 +31,7 @@ render_prometheus, ) -MAX_DB_INT = (2**63) - 1 +MAX_DB_INT = (2**63) - 2 RMAPHandler = None # default if not os.environ.get("TATOU_TEST_DISABLE_RMAP"):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.26s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_689"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_689_1" aria-expanded="false" aria-controls="job_list___sub_collapse_689_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_689_1"><button class="btn btn-outline-success"><span class="job_id">689 : Job ID e2eddb1f1c9b4a88b3cd1535c5f591b5</span></button></div></a><div aria-labelledby="job_list___sub_heading_689_1" data-parent="#job_list___sub_accordion_689" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_689_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=34" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (34, 23), end pos: (34, 24)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -31,7 +31,7 @@ render_prometheus, ) -MAX_DB_INT = (2**63) - 1 +MAX_DB_INT = (2**63) - 0 RMAPHandler = None # default if not os.environ.get("TATOU_TEST_DISABLE_RMAP"):</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T055509820720Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T055510764647Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.50s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_690"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_690_1" aria-expanded="false" aria-controls="job_list___sub_collapse_690_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_690_1"><button class="btn btn-outline-success"><span class="job_id">690 : Job ID 50282b0863654548b9b1e4f86f2ced68</span></button></div></a><div aria-labelledby="job_list___sub_heading_690_1" data-parent="#job_list___sub_accordion_690" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_690_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=94" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (94, 42), end pos: (94, 45)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -91,7 +91,7 @@ def _serializer(): return URLSafeTimedSerializer(app.config["SECRET_KEY"], salt="ljkdsad123123kjd") - def _auth_error(msg: str, code: int = 401): + def _auth_error(msg: str, code: int = 402): app.logger.warning("Auth error (%s): %s", code, msg) return jsonify({"error": msg}), code </pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ec7e9bd07c622611b: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.96s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_691"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_691_1" aria-expanded="false" aria-controls="job_list___sub_collapse_691_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_691_1"><button class="btn btn-outline-danger"><span class="job_id">691 : Job ID d83b24da057649179c00f5d62d0b711c</span></button></div></a><div aria-labelledby="job_list___sub_heading_691_1" data-parent="#job_list___sub_accordion_691" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_691_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=94" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (94, 42), end pos: (94, 45)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -91,7 +91,7 @@ def _serializer(): return URLSafeTimedSerializer(app.config["SECRET_KEY"], salt="ljkdsad123123kjd") - def _auth_error(msg: str, code: int = 401): + def _auth_error(msg: str, code: int = 400): app.logger.warning("Auth error (%s): %s", code, msg) return jsonify({"error": msg}), code </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.44s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_692"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_692_1" aria-expanded="false" aria-controls="job_list___sub_collapse_692_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_692_1"><button class="btn btn-outline-success"><span class="job_id">692 : Job ID 296c9e448dea4036a5f0ac09e31e7b80</span></button></div></a><div aria-labelledby="job_list___sub_heading_692_1" data-parent="#job_list___sub_accordion_692" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_692_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=102" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (102, 32), end pos: (102, 33)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 8</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -99,7 +99,7 @@ @wraps(f) def wrapper(*args, **kwargs): if app.config['TESTING']: - g.user = {"id": 1, "login": "username", "email": "user@email.se"} + g.user = {"id": 2, "login": "username", "email": "user@email.se"} return f(*args, **kwargs) auth = request.headers.get("Authorization", "") if not auth.startswith("Bearer "):</pre></div><div class="alert alert-secondary"><pre class="diff">...F.F.F.FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T195606495005Z__input.pdf user=2 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T195607669469Z__watermarked.pdf user=2 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 6 failed, 8 passed, 22 warnings in 20.01s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_693"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_693_1" aria-expanded="false" aria-controls="job_list___sub_collapse_693_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_693_1"><button class="btn btn-outline-success"><span class="job_id">693 : Job ID 938edbc7787a48a58d418e233fde9804</span></button></div></a><div aria-labelledby="job_list___sub_heading_693_1" data-parent="#job_list___sub_accordion_693" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_693_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=102" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (102, 32), end pos: (102, 33)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 9</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -99,7 +99,7 @@ @wraps(f) def wrapper(*args, **kwargs): if app.config['TESTING']: - g.user = {"id": 1, "login": "username", "email": "user@email.se"} + g.user = {"id": 0, "login": "username", "email": "user@email.se"} return f(*args, **kwargs) auth = request.headers.get("Authorization", "") if not auth.startswith("Bearer "):</pre></div><div class="alert alert-secondary"><pre class="diff">...F.FFF.FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T212348049909Z__input.pdf user=0 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 35 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:530 Missing user info in auth token ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T212349231492Z__watermarked.pdf user=0 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 401 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 7 failed, 7 passed, 22 warnings in 20.30s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_694"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_694_1" aria-expanded="false" aria-controls="job_list___sub_collapse_694_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_694_1"><button class="btn btn-outline-danger"><span class="job_id">694 : Job ID 5d07a64ee86b49baa59716afee3b7815</span></button></div></a><div aria-labelledby="job_list___sub_heading_694_1" data-parent="#job_list___sub_accordion_694" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_694_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=107" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (107, 36), end pos: (107, 37)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 10</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -104,7 +104,7 @@ auth = request.headers.get("Authorization", "") if not auth.startswith("Bearer "): return _auth_error("Missing or invalid Authorization header") - token = auth.split(" ", 1)[1].strip() + token = auth.split(" ", 2)[1].strip() try: data = _serializer().loads( token, max_age=app.config["TOKEN_TTL_SECONDS"]</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.19s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_695"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_695_1" aria-expanded="false" aria-controls="job_list___sub_collapse_695_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_695_1"><button class="btn btn-outline-danger"><span class="job_id">695 : Job ID 13b92424c4084462b47024c3ff5dc21f</span></button></div></a><div aria-labelledby="job_list___sub_heading_695_1" data-parent="#job_list___sub_accordion_695" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_695_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=107" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (107, 36), end pos: (107, 37)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 11</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -104,7 +104,7 @@ auth = request.headers.get("Authorization", "") if not auth.startswith("Bearer "): return _auth_error("Missing or invalid Authorization header") - token = auth.split(" ", 1)[1].strip() + token = auth.split(" ", 0)[1].strip() try: data = _serializer().loads( token, max_age=app.config["TOKEN_TTL_SECONDS"]</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.18s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_696"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_696_1" aria-expanded="false" aria-controls="job_list___sub_collapse_696_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_696_1"><button class="btn btn-outline-success"><span class="job_id">696 : Job ID 94ed6d7955914ba5bb1eccebd05a4690</span></button></div></a><div aria-labelledby="job_list___sub_heading_696_1" data-parent="#job_list___sub_accordion_696" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_696_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=107" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (107, 39), end pos: (107, 40)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 12</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -104,7 +104,7 @@ auth = request.headers.get("Authorization", "") if not auth.startswith("Bearer "): return _auth_error("Missing or invalid Authorization header") - token = auth.split(" ", 1)[1].strip() + token = auth.split(" ", 1)[ 2].strip() try: data = _serializer().loads( token, max_age=app.config["TOKEN_TTL_SECONDS"]</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T230819227889Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T230820126490Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.39s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_697"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_697_1" aria-expanded="false" aria-controls="job_list___sub_collapse_697_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_697_1"><button class="btn btn-outline-success"><span class="job_id">697 : Job ID 964c7bd12b5c4c219f32c801de3b9446</span></button></div></a><div aria-labelledby="job_list___sub_heading_697_1" data-parent="#job_list___sub_accordion_697" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_697_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=107" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (107, 39), end pos: (107, 40)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 13</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -104,7 +104,7 @@ auth = request.headers.get("Authorization", "") if not auth.startswith("Bearer "): return _auth_error("Missing or invalid Authorization header") - token = auth.split(" ", 1)[1].strip() + token = auth.split(" ", 1)[ 0].strip() try: data = _serializer().loads( token, max_age=app.config["TOKEN_TTL_SECONDS"]</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T213700146614Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T213701015355Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.36s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_698"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_698_1" aria-expanded="false" aria-controls="job_list___sub_collapse_698_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_698_1"><button class="btn btn-outline-danger"><span class="job_id">698 : Job ID 06857fdb755443c9bc8821d2eb38c8c0</span></button></div></a><div aria-labelledby="job_list___sub_heading_698_1" data-parent="#job_list___sub_accordion_698" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_698_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=130" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (130, 45), end pos: (130, 49)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 14</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -127,7 +127,7 @@ def _sha256_file(path: Path) -&gt; str: h = hashlib.sha256() with path.open("rb") as f: - for chunk in iter(lambda: f.read(1024 * 1024), b""): + for chunk in iter(lambda: f.read( 1025 * 1024), b""): h.update(chunk) return h.hexdigest() </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.24s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_699"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_699_1" aria-expanded="false" aria-controls="job_list___sub_collapse_699_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_699_1"><button class="btn btn-outline-danger"><span class="job_id">699 : Job ID 182eb649aa3e43afa51eea9ad94a6cee</span></button></div></a><div aria-labelledby="job_list___sub_heading_699_1" data-parent="#job_list___sub_accordion_699" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_699_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=130" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (130, 45), end pos: (130, 49)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 15</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -127,7 +127,7 @@ def _sha256_file(path: Path) -&gt; str: h = hashlib.sha256() with path.open("rb") as f: - for chunk in iter(lambda: f.read(1024 * 1024), b""): + for chunk in iter(lambda: f.read( 1023 * 1024), b""): h.update(chunk) return h.hexdigest() </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.42s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_700"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_700_1" aria-expanded="false" aria-controls="job_list___sub_collapse_700_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_700_1"><button class="btn btn-outline-danger"><span class="job_id">700 : Job ID df861ed54d304a94b35d970f17fbfa47</span></button></div></a><div aria-labelledby="job_list___sub_heading_700_1" data-parent="#job_list___sub_accordion_700" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_700_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=130" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (130, 52), end pos: (130, 56)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 16</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -127,7 +127,7 @@ def _sha256_file(path: Path) -&gt; str: h = hashlib.sha256() with path.open("rb") as f: - for chunk in iter(lambda: f.read(1024 * 1024), b""): + for chunk in iter(lambda: f.read(1024 * 1025), b""): h.update(chunk) return h.hexdigest() </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.43s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_701"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_701_1" aria-expanded="false" aria-controls="job_list___sub_collapse_701_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_701_1"><button class="btn btn-outline-success"><span class="job_id">701 : Job ID 2635080237934f2b9e36932d186a445c</span></button></div></a><div aria-labelledby="job_list___sub_heading_701_1" data-parent="#job_list___sub_accordion_701" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_701_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=130" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (130, 52), end pos: (130, 56)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 17</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -127,7 +127,7 @@ def _sha256_file(path: Path) -&gt; str: h = hashlib.sha256() with path.open("rb") as f: - for chunk in iter(lambda: f.read(1024 * 1024), b""): + for chunk in iter(lambda: f.read(1024 * 1023), b""): h.update(chunk) return h.hexdigest() </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T171501887559Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T171502835134Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.47s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_702"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_702_1" aria-expanded="false" aria-controls="job_list___sub_collapse_702_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_702_1"><button class="btn btn-outline-success"><span class="job_id">702 : Job ID 401c43be248148f9ae8a125c7a4d6f25</span></button></div></a><div aria-labelledby="job_list___sub_heading_702_1" data-parent="#job_list___sub_accordion_702" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_702_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=183" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (183, 11), end pos: (183, 14)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 18</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -180,7 +180,7 @@ db_ok = False return jsonify( {"message": "The server is up and running.", "db_connected": db_ok} - ), 200 + ), 201 # Extra backend validation for user input def validate_user_input(email: str, login: str) -&gt; tuple[bool, str]:</pre></div><div class="alert alert-secondary"><pre class="diff">FFFFFFFF.FFF.. [100%] ================================== FAILURES =================================== _____________________________ test_healthz_route ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_healthz_route(client): """Test the health check endpoint.""" resp = client.get("/healthz") &gt; assert resp.status_code == 200 # nosec B101 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 201 == 200 E + where 201 = &lt;WrapperTestResponse streamed [201 CREATED]&gt;.status_code ..\test\test_api.py:56: AssertionError ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T172132491002Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T172133349927Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_healthz_route - assert 201 == 200 FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 11 failed, 3 passed, 22 warnings in 19.31s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_703"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_703_1" aria-expanded="false" aria-controls="job_list___sub_collapse_703_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_703_1"><button class="btn btn-outline-success"><span class="job_id">703 : Job ID 626ae60e17cb48e081244a6e5506b612</span></button></div></a><div aria-labelledby="job_list___sub_heading_703_1" data-parent="#job_list___sub_accordion_703" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_703_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=183" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (183, 11), end pos: (183, 14)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 19</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -180,7 +180,7 @@ db_ok = False return jsonify( {"message": "The server is up and running.", "db_connected": db_ok} - ), 200 + ), 199 # Extra backend validation for user input def validate_user_input(email: str, login: str) -&gt; tuple[bool, str]:</pre></div><div class="alert alert-secondary"><pre class="diff">F............. [100%] ================================== FAILURES =================================== _____________________________ test_healthz_route ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_healthz_route(client): """Test the health check endpoint.""" resp = client.get("/healthz") &gt; assert resp.status_code == 200 # nosec B101 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 199 == 200 E + where 199 = &lt;WrapperTestResponse streamed [199 UNKNOWN]&gt;.status_code ..\test\test_api.py:56: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_healthz_route - assert 199 == 200 1 failed, 13 passed, 22 warnings in 20.77s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_704"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_704_1" aria-expanded="false" aria-controls="job_list___sub_collapse_704_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_704_1"><button class="btn btn-outline-danger"><span class="job_id">704 : Job ID 6df7c0abc526415e866274b9d2b60b58</span></button></div></a><div aria-labelledby="job_list___sub_heading_704_1" data-parent="#job_list___sub_accordion_704" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_704_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=188" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (188, 24), end pos: (188, 27)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 20</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -185,7 +185,7 @@ # Extra backend validation for user input def validate_user_input(email: str, login: str) -&gt; tuple[bool, str]: """Validate user input before database operations""" - if len(email) &gt; 320 or len(login) &gt; 64: + if len(email) &gt; 321 or len(login) &gt; 64: return False, "Email or login too long" if not re.match(r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$", email): return False, "Invalid email format"</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.24s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_705"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_705_1" aria-expanded="false" aria-controls="job_list___sub_collapse_705_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_705_1"><button class="btn btn-outline-success"><span class="job_id">705 : Job ID fb0e1fdcee914cb7b1e995bbad4330c2</span></button></div></a><div aria-labelledby="job_list___sub_heading_705_1" data-parent="#job_list___sub_accordion_705" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_705_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=188" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (188, 24), end pos: (188, 27)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 21</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -185,7 +185,7 @@ # Extra backend validation for user input def validate_user_input(email: str, login: str) -&gt; tuple[bool, str]: """Validate user input before database operations""" - if len(email) &gt; 320 or len(login) &gt; 64: + if len(email) &gt; 319 or len(login) &gt; 64: return False, "Email or login too long" if not re.match(r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$", email): return False, "Invalid email format"</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T054420761243Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T054421689486Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 20.40s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_706"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_706_1" aria-expanded="false" aria-controls="job_list___sub_collapse_706_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_706_1"><button class="btn btn-outline-danger"><span class="job_id">706 : Job ID 2e9c6e58e7f540ba961a3494ffe7f509</span></button></div></a><div aria-labelledby="job_list___sub_heading_706_1" data-parent="#job_list___sub_accordion_706" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_706_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=188" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (188, 44), end pos: (188, 46)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 22</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -185,7 +185,7 @@ # Extra backend validation for user input def validate_user_input(email: str, login: str) -&gt; tuple[bool, str]: """Validate user input before database operations""" - if len(email) &gt; 320 or len(login) &gt; 64: + if len(email) &gt; 320 or len(login) &gt; 65: return False, "Email or login too long" if not re.match(r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$", email): return False, "Invalid email format"</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.09s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_707"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_707_1" aria-expanded="false" aria-controls="job_list___sub_collapse_707_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_707_1"><button class="btn btn-outline-success"><span class="job_id">707 : Job ID 7f4bbf08d9fd483abc5255ec5b343a2c</span></button></div></a><div aria-labelledby="job_list___sub_heading_707_1" data-parent="#job_list___sub_accordion_707" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_707_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=188" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (188, 44), end pos: (188, 46)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 23</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -185,7 +185,7 @@ # Extra backend validation for user input def validate_user_input(email: str, login: str) -&gt; tuple[bool, str]: """Validate user input before database operations""" - if len(email) &gt; 320 or len(login) &gt; 64: + if len(email) &gt; 320 or len(login) &gt; 63: return False, "Email or login too long" if not re.match(r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$", email): return False, "Invalid email format"</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%]</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_708"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_708_1" aria-expanded="false" aria-controls="job_list___sub_collapse_708_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_708_1"><button class="btn btn-outline-success"><span class="job_id">708 : Job ID b6bfa47e9b0844dd9ef3f94dc9b3e210</span></button></div></a><div aria-labelledby="job_list___sub_heading_708_1" data-parent="#job_list___sub_accordion_708" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_708_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=206" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (206, 82), end pos: (206, 85)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 24</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -203,7 +203,7 @@ start_db = time.time() if not email or not login or not password: app.logger.warning("Missing fields in user creation: %s", payload) - return jsonify({"error": "email, login, and password are required"}), 400 + return jsonify({"error": "email, login, and password are required"}), 401 hpw = generate_password_hash(password) </pre></div><div class="alert alert-secondary"><pre class="diff">.F............ [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests assert resp.status_code == 201 # Endpoint should exist assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) assert isinstance(resp_data.get("login"), str) assert isinstance(resp_data.get("email"), str) #check values are what we submitted assert resp_data.get("login") == parameters["login"] assert resp_data.get("email") == parameters["email"] #Test with missing parameters # Missing email resp = client.post("/api/create-user",json={ "login": "username", "password": "password", }, # pragma: allowlist secret ) &gt; assert resp.status_code == 400 E assert 401 == 400 E + where 401 = &lt;WrapperTestResponse streamed [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:90: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:205 Missing fields in user creation: {'login': 'username', 'password': 'password'} ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 401 == 400 1 failed, 13 passed, 22 warnings in 21.42s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_709"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_709_1" aria-expanded="false" aria-controls="job_list___sub_collapse_709_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_709_1"><button class="btn btn-outline-success"><span class="job_id">709 : Job ID 7e0041bda3a0402987faff383099ab0a</span></button></div></a><div aria-labelledby="job_list___sub_heading_709_1" data-parent="#job_list___sub_accordion_709" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_709_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=206" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (206, 82), end pos: (206, 85)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 25</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -203,7 +203,7 @@ start_db = time.time() if not email or not login or not password: app.logger.warning("Missing fields in user creation: %s", payload) - return jsonify({"error": "email, login, and password are required"}), 400 + return jsonify({"error": "email, login, and password are required"}), 399 hpw = generate_password_hash(password) </pre></div><div class="alert alert-secondary"><pre class="diff">.F............ [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests assert resp.status_code == 201 # Endpoint should exist assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) assert isinstance(resp_data.get("login"), str) assert isinstance(resp_data.get("email"), str) #check values are what we submitted assert resp_data.get("login") == parameters["login"] assert resp_data.get("email") == parameters["email"] #Test with missing parameters # Missing email resp = client.post("/api/create-user",json={ "login": "username", "password": "password", }, # pragma: allowlist secret ) &gt; assert resp.status_code == 400 E assert 399 == 400 E + where 399 = &lt;WrapperTestResponse streamed [399 UNKNOWN]&gt;.status_code ..\test\test_api.py:90: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:205 Missing fields in user creation: {'login': 'username', 'password': 'password'} ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 399 == 400 1 failed, 13 passed, 22 warnings in 21.26s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_710"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_710_1" aria-expanded="false" aria-controls="job_list___sub_collapse_710_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_710_1"><button class="btn btn-outline-danger"><span class="job_id">710 : Job ID 156b6f69d225499ca64875105f00ca5a</span></button></div></a><div aria-labelledby="job_list___sub_heading_710_1" data-parent="#job_list___sub_accordion_710" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_710_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=214" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (214, 54), end pos: (214, 57)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 26</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -211,7 +211,7 @@ is_valid, error_msg = validate_user_input(email, login) if not is_valid: app.logger.warning("User input validation failed: %s", error_msg) - return jsonify({"error": error_msg}), 400 + return jsonify({"error": error_msg}), 401 with get_engine().begin() as conn: res = conn.execute(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.04s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_711"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_711_1" aria-expanded="false" aria-controls="job_list___sub_collapse_711_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_711_1"><button class="btn btn-outline-danger"><span class="job_id">711 : Job ID 87f5db6e6ec64c929c5dc5fac476c7d7</span></button></div></a><div aria-labelledby="job_list___sub_heading_711_1" data-parent="#job_list___sub_accordion_711" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_711_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=214" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (214, 54), end pos: (214, 57)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 27</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -211,7 +211,7 @@ is_valid, error_msg = validate_user_input(email, login) if not is_valid: app.logger.warning("User input validation failed: %s", error_msg) - return jsonify({"error": error_msg}), 400 + return jsonify({"error": error_msg}), 399 with get_engine().begin() as conn: res = conn.execute(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.07s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_712"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_712_1" aria-expanded="false" aria-controls="job_list___sub_collapse_712_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_712_1"><button class="btn btn-outline-success"><span class="job_id">712 : Job ID d514f6a037ac40ed8b6252f01fcfc503</span></button></div></a><div aria-labelledby="job_list___sub_heading_712_1" data-parent="#job_list___sub_accordion_712" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_712_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=234" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (234, 72), end pos: (234, 75)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 28</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -231,7 +231,7 @@ app.logger.warning( "Attempt to create duplicate user: email=%s, login=%s", email, login ) - return jsonify({"error": "email or login already exists"}), 409 + return jsonify({"error": "email or login already exists"}), 410 except Exception as e: app.logger.error("Database error in create_user: %s", e) return jsonify({"error": "database error"}), 503</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T205040241902Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T205041357658Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 20.92s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_713"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_713_1" aria-expanded="false" aria-controls="job_list___sub_collapse_713_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_713_1"><button class="btn btn-outline-danger"><span class="job_id">713 : Job ID 5362550fed0d44499ccf6a66f0bf7648</span></button></div></a><div aria-labelledby="job_list___sub_heading_713_1" data-parent="#job_list___sub_accordion_713" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_713_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=234" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (234, 72), end pos: (234, 75)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 29</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -231,7 +231,7 @@ app.logger.warning( "Attempt to create duplicate user: email=%s, login=%s", email, login ) - return jsonify({"error": "email or login already exists"}), 409 + return jsonify({"error": "email or login already exists"}), 408 except Exception as e: app.logger.error("Database error in create_user: %s", e) return jsonify({"error": "database error"}), 503</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.98s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_714"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_714_1" aria-expanded="false" aria-controls="job_list___sub_collapse_714_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_714_1"><button class="btn btn-outline-success"><span class="job_id">714 : Job ID c809ddaba0bc4dd78e06745257a5aa4e</span></button></div></a><div aria-labelledby="job_list___sub_heading_714_1" data-parent="#job_list___sub_accordion_714" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_714_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=237" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (237, 57), end pos: (237, 60)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 30</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -234,7 +234,7 @@ return jsonify({"error": "email or login already exists"}), 409 except Exception as e: app.logger.error("Database error in create_user: %s", e) - return jsonify({"error": "database error"}), 503 + return jsonify({"error": "database error"}), 504 return jsonify({"id": row.id, "email": row.email, "login": row.login}), 201 </pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e877cd61f49c030bf: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.71s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_715"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_715_1" aria-expanded="false" aria-controls="job_list___sub_collapse_715_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_715_1"><button class="btn btn-outline-danger"><span class="job_id">715 : Job ID 6ef5b8bda9b744ab9002f868a093f1e7</span></button></div></a><div aria-labelledby="job_list___sub_heading_715_1" data-parent="#job_list___sub_accordion_715" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_715_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=237" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (237, 57), end pos: (237, 60)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 31</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -234,7 +234,7 @@ return jsonify({"error": "email or login already exists"}), 409 except Exception as e: app.logger.error("Database error in create_user: %s", e) - return jsonify({"error": "database error"}), 503 + return jsonify({"error": "database error"}), 502 return jsonify({"id": row.id, "email": row.email, "login": row.login}), 201 </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.28s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_716"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_716_1" aria-expanded="false" aria-controls="job_list___sub_collapse_716_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_716_1"><button class="btn btn-outline-success"><span class="job_id">716 : Job ID 8dd441b3b6e94e5c94e20fbb70c2f2ef</span></button></div></a><div aria-labelledby="job_list___sub_heading_716_1" data-parent="#job_list___sub_accordion_716" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_716_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=239" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (239, 80), end pos: (239, 83)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 32</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -236,7 +236,7 @@ app.logger.error("Database error in create_user: %s", e) return jsonify({"error": "database error"}), 503 - return jsonify({"id": row.id, "email": row.email, "login": row.login}), 201 + return jsonify({"id": row.id, "email": row.email, "login": row.login}), 202 # POST /api/login {login, password} @app.post("/api/login")</pre></div><div class="alert alert-secondary"><pre class="diff">.F............ [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 202 == 201 E + where 202 = &lt;WrapperTestResponse 52 bytes [202 ACCEPTED]&gt;.status_code ..\test\test_api.py:73: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 202 == 201 1 failed, 13 passed, 22 warnings in 20.39s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_717"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_717_1" aria-expanded="false" aria-controls="job_list___sub_collapse_717_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_717_1"><button class="btn btn-outline-success"><span class="job_id">717 : Job ID 1ea5d280357048eaa7045f1fccbaa932</span></button></div></a><div aria-labelledby="job_list___sub_heading_717_1" data-parent="#job_list___sub_accordion_717" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_717_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=239" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (239, 80), end pos: (239, 83)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 33</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -236,7 +236,7 @@ app.logger.error("Database error in create_user: %s", e) return jsonify({"error": "database error"}), 503 - return jsonify({"id": row.id, "email": row.email, "login": row.login}), 201 + return jsonify({"id": row.id, "email": row.email, "login": row.login}), 200 # POST /api/login {login, password} @app.post("/api/login")</pre></div><div class="alert alert-secondary"><pre class="diff">.F............ [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 200 == 201 E + where 200 = &lt;WrapperTestResponse 52 bytes [200 OK]&gt;.status_code ..\test\test_api.py:73: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 200 == 201 1 failed, 13 passed, 22 warnings in 20.47s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_718"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_718_1" aria-expanded="false" aria-controls="job_list___sub_collapse_718_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_718_1"><button class="btn btn-outline-success"><span class="job_id">718 : Job ID c9fc4872fcc94de4ad797349af211769</span></button></div></a><div aria-labelledby="job_list___sub_heading_718_1" data-parent="#job_list___sub_accordion_718" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_718_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=250" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (250, 74), end pos: (250, 77)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 34</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -247,7 +247,7 @@ if not email or not password: app.logger.warning("Missing fields in login attempt: %s", payload) - return jsonify({"error": "email and password are required"}), 400 + return jsonify({"error": "email and password are required"}), 401 start_db = time.time() try:</pre></div><div class="alert alert-secondary"><pre class="diff">..F........... [100%] ================================== FAILURES =================================== ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests assert resp.status_code == 200 assert resp.is_json #check types assert isinstance(resp_data.get("token"), str) assert isinstance(resp_data.get("token_type"), str) assert isinstance(resp_data.get("expires_in"), int) #check val assert resp_data.get("token_type") == "bearer" #Test with missing parameters # Missing email resp = client.post("/api/login", json={"password": "password"}) &gt; assert resp.status_code == 400 E assert 401 == 400 E + where 401 = &lt;WrapperTestResponse streamed [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:129: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:249 Missing fields in login attempt: {'password': 'password'} ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_login_route - assert 401 == 400 1 failed, 13 passed, 22 warnings in 20.36s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_719"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_719_1" aria-expanded="false" aria-controls="job_list___sub_collapse_719_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_719_1"><button class="btn btn-outline-success"><span class="job_id">719 : Job ID f1b25dfa2cf1473eb2295a0954bbf338</span></button></div></a><div aria-labelledby="job_list___sub_heading_719_1" data-parent="#job_list___sub_accordion_719" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_719_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=250" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (250, 74), end pos: (250, 77)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 35</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -247,7 +247,7 @@ if not email or not password: app.logger.warning("Missing fields in login attempt: %s", payload) - return jsonify({"error": "email and password are required"}), 400 + return jsonify({"error": "email and password are required"}), 399 start_db = time.time() try:</pre></div><div class="alert alert-secondary"><pre class="diff">..F........... [100%] ================================== FAILURES =================================== ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests assert resp.status_code == 200 assert resp.is_json #check types assert isinstance(resp_data.get("token"), str) assert isinstance(resp_data.get("token_type"), str) assert isinstance(resp_data.get("expires_in"), int) #check val assert resp_data.get("token_type") == "bearer" #Test with missing parameters # Missing email resp = client.post("/api/login", json={"password": "password"}) &gt; assert resp.status_code == 400 E assert 399 == 400 E + where 399 = &lt;WrapperTestResponse streamed [399 UNKNOWN]&gt;.status_code ..\test\test_api.py:129: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:249 Missing fields in login attempt: {'password': 'password'} ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_login_route - assert 399 == 400 1 failed, 13 passed, 22 warnings in 20.36s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_720"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_720_1" aria-expanded="false" aria-controls="job_list___sub_collapse_720_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_720_1"><button class="btn btn-outline-success"><span class="job_id">720 : Job ID b73ca6b234a8402babb39f18e3450181</span></button></div></a><div aria-labelledby="job_list___sub_heading_720_1" data-parent="#job_list___sub_accordion_720" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_720_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=277" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (277, 70), end pos: (277, 73)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 36</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -274,7 +274,7 @@ email if email else "&lt;empty&gt;", ) inc_login_failure("invalid_credentials") - return jsonify({"error": "invalid credentials"}), 401 + return jsonify({"error": "invalid credentials"}), 402 except Exception as e: app.logger.error("Database error in login: %s", e)</pre></div><div class="alert alert-secondary"><pre class="diff">...F.......... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:228: in open request = self._request_from_builder_args(args, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:200: in _request_from_builder_args return builder.get_request() ^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:764: in get_request return cls(self.get_environ()) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:688: in get_environ input_stream, content_length, boundary = stream_encode_multipart( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:130: in stream_encode_multipart write_binary(encoder.send_event(Data(data=chunk, more_data=True))) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:81: in write_binary return stream.write(s) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... 1 failed, 13 passed, 22 warnings in 21.32s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_721"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_721_1" aria-expanded="false" aria-controls="job_list___sub_collapse_721_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_721_1"><button class="btn btn-outline-danger"><span class="job_id">721 : Job ID b1adc47ad6ae40fa8fc26fff82208b09</span></button></div></a><div aria-labelledby="job_list___sub_heading_721_1" data-parent="#job_list___sub_accordion_721" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_721_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=277" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (277, 70), end pos: (277, 73)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 37</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -274,7 +274,7 @@ email if email else "&lt;empty&gt;", ) inc_login_failure("invalid_credentials") - return jsonify({"error": "invalid credentials"}), 401 + return jsonify({"error": "invalid credentials"}), 400 except Exception as e: app.logger.error("Database error in login: %s", e)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.20s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_722"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_722_1" aria-expanded="false" aria-controls="job_list___sub_collapse_722_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_722_1"><button class="btn btn-outline-danger"><span class="job_id">722 : Job ID ed563a8ac50e4d38beef815757551409</span></button></div></a><div aria-labelledby="job_list___sub_heading_722_1" data-parent="#job_list___sub_accordion_722" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_722_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=282" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (282, 60), end pos: (282, 63)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 38</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -279,7 +279,7 @@ except Exception as e: app.logger.error("Database error in login: %s", e) inc_db_error("login_select") - return jsonify({"error": "An error occurred"}), 503 + return jsonify({"error": "An error occurred"}), 504 observe_db_latency("login_select", time.time() - start_db) token = _serializer().dumps(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.31s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_723"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_723_1" aria-expanded="false" aria-controls="job_list___sub_collapse_723_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_723_1"><button class="btn btn-outline-danger"><span class="job_id">723 : Job ID d534bb1841d643dda9a6f046624c30a9</span></button></div></a><div aria-labelledby="job_list___sub_heading_723_1" data-parent="#job_list___sub_accordion_723" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_723_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=282" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (282, 60), end pos: (282, 63)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 39</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -279,7 +279,7 @@ except Exception as e: app.logger.error("Database error in login: %s", e) inc_db_error("login_select") - return jsonify({"error": "An error occurred"}), 503 + return jsonify({"error": "An error occurred"}), 502 observe_db_latency("login_select", time.time() - start_db) token = _serializer().dumps(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.31s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_724"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_724_1" aria-expanded="false" aria-controls="job_list___sub_collapse_724_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_724_1"><button class="btn btn-outline-success"><span class="job_id">724 : Job ID 47bae72649a94b128e678d756a3d1846</span></button></div></a><div aria-labelledby="job_list___sub_heading_724_1" data-parent="#job_list___sub_accordion_724" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_724_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=295" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (295, 11), end pos: (295, 14)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 40</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -292,7 +292,7 @@ "token_type": "bearer", "expires_in": app.config["TOKEN_TTL_SECONDS"], } - ), 200 + ), 201 # POST /api/upload-document (multipart/form-data) @app.post("/api/upload-document")</pre></div><div class="alert alert-secondary"><pre class="diff">..F........... [100%] ================================== FAILURES =================================== ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 201 == 200 E + where 201 = &lt;WrapperTestResponse 159 bytes [201 CREATED]&gt;.status_code ..\test\test_api.py:117: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_login_route - assert 201 == 200 1 failed, 13 passed, 22 warnings in 20.79s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_725"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_725_1" aria-expanded="false" aria-controls="job_list___sub_collapse_725_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_725_1"><button class="btn btn-outline-success"><span class="job_id">725 : Job ID 45ef3b148a8b481488309fb7cf32705e</span></button></div></a><div aria-labelledby="job_list___sub_heading_725_1" data-parent="#job_list___sub_accordion_725" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_725_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=295" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (295, 11), end pos: (295, 14)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 41</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -292,7 +292,7 @@ "token_type": "bearer", "expires_in": app.config["TOKEN_TTL_SECONDS"], } - ), 200 + ), 199 # POST /api/upload-document (multipart/form-data) @app.post("/api/upload-document")</pre></div><div class="alert alert-secondary"><pre class="diff">..FF.....FFF.F [100%] ================================== FAILURES =================================== ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) &gt; resp_data = resp.get_json() ^^^^^^^^^^^^^^^ ..\test\test_api.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\response.py:620: in get_json return self.json_module.loads(data) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\json\provider.py:187: in loads return json.loads(s, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\json\__init__.py:346: in loads return _default_decoder.decode(s) ^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\json\decoder.py:337: in decode obj, end = self.raw_decode(s, idx=_w(s, 0).end()) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = &lt;json.decoder.JSONDecoder object at 0x0000023C1B1148C0&gt;, s = '', idx = 0 def raw_decode(self, s, idx=0): """Decode a JSON document from ``s`` (a ``str`` beginning with a JSON document) and return a 2-tuple of the Python representation and the index in ``s`` where the document ended. This can be used to decode a JSON document from a string that may have extraneous data at the end. """ try: obj, end = self.scan_once(s, idx) except StopIteration as err: &gt; raise JSONDecodeError("Expecting value", s, err.value) from None E json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\json\decoder.py:355: JSONDecodeError _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ed0187df42caebe98: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_login_route - json.decoder.JSONDecodeError: ... FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 6 failed, 8 passed, 22 warnings in 21.19s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_726"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_726_1" aria-expanded="false" aria-controls="job_list___sub_collapse_726_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_726_1"><button class="btn btn-outline-success"><span class="job_id">726 : Job ID 1118c20ff57f45fd83b907db7a6cd69f</span></button></div></a><div aria-labelledby="job_list___sub_heading_726_1" data-parent="#job_list___sub_accordion_726" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_726_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=304" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (304, 81), end pos: (304, 84)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 42</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -301,7 +301,7 @@ if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") - return jsonify({"error": "file is required (multipart/form-data)"}), 400 + return jsonify({"error": "file is required (multipart/form-data)"}), 401 file = request.files["file"] if not file or file.filename == "":</pre></div><div class="alert alert-secondary"><pre class="diff">...F.......... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") &gt; assert resp.status_code == 400 E assert 401 == 400 E + where 401 = &lt;WrapperTestResponse streamed [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:165: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - assert 401 == 400 1 failed, 13 passed, 22 warnings in 20.30s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_727"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_727_1" aria-expanded="false" aria-controls="job_list___sub_collapse_727_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_727_1"><button class="btn btn-outline-success"><span class="job_id">727 : Job ID f8e55df2ee70437aaebdbaf816ee09ea</span></button></div></a><div aria-labelledby="job_list___sub_heading_727_1" data-parent="#job_list___sub_accordion_727" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_727_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=304" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (304, 81), end pos: (304, 84)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 43</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -301,7 +301,7 @@ if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") - return jsonify({"error": "file is required (multipart/form-data)"}), 400 + return jsonify({"error": "file is required (multipart/form-data)"}), 399 file = request.files["file"] if not file or file.filename == "":</pre></div><div class="alert alert-secondary"><pre class="diff">...F.......... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") &gt; assert resp.status_code == 400 E assert 399 == 400 E + where 399 = &lt;WrapperTestResponse streamed [399 UNKNOWN]&gt;.status_code ..\test\test_api.py:165: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - assert 399 == 400 1 failed, 13 passed, 22 warnings in 20.14s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_728"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_728_1" aria-expanded="false" aria-controls="job_list___sub_collapse_728_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_728_1"><button class="btn btn-outline-danger"><span class="job_id">728 : Job ID e091390d16664dffa50dbabee07fa2f2</span></button></div></a><div aria-labelledby="job_list___sub_heading_728_1" data-parent="#job_list___sub_accordion_728" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_728_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=309" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (309, 57), end pos: (309, 60)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 44</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -306,7 +306,7 @@ file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") - return jsonify({"error": "empty filename"}), 400 + return jsonify({"error": "empty filename"}), 401 start_db = time.time() # Validate file size</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.16s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_729"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_729_1" aria-expanded="false" aria-controls="job_list___sub_collapse_729_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_729_1"><button class="btn btn-outline-danger"><span class="job_id">729 : Job ID 799fb095aad246e4849a864faba89037</span></button></div></a><div aria-labelledby="job_list___sub_heading_729_1" data-parent="#job_list___sub_accordion_729" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_729_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=309" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (309, 57), end pos: (309, 60)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 45</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -306,7 +306,7 @@ file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") - return jsonify({"error": "empty filename"}), 400 + return jsonify({"error": "empty filename"}), 399 start_db = time.time() # Validate file size</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.65s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_730"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_730_1" aria-expanded="false" aria-controls="job_list___sub_collapse_730_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_730_1"><button class="btn btn-outline-success"><span class="job_id">730 : Job ID 813ee23d2b6e4467859de9030a157e92</span></button></div></a><div aria-labelledby="job_list___sub_heading_730_1" data-parent="#job_list___sub_accordion_730" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_730_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=313" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (313, 24), end pos: (313, 26)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 46</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -310,7 +310,7 @@ start_db = time.time() # Validate file size - MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB + MAX_FILE_SIZE = 51 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename)</pre></div><div class="alert alert-secondary"><pre class="diff">...F......F... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') &gt; assert resp.status_code == 413 E assert 201 == 413 E + where 201 = &lt;WrapperTestResponse streamed [201 CREATED]&gt;.status_code ..\test\test_api.py:181: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 &gt; assert upload_resp_data.get("id") == 2 E AssertionError: assert 3 == 2 E + where 3 = &lt;built-in method get of dict object at 0x00000203CEDD0FC0&gt;('id') E + where &lt;built-in method get of dict object at 0x00000203CEDD0FC0&gt; = {'creation': '2025-10-16T22:21:53.957215', 'id': 3, 'name': 'Water File', 'sha256': '5FBAC867F5EFDD7B0AB5C11456B204DDD08FF8801502C93728BE3B38BFAFE80C', ...}.get ..\test\test_api.py:390: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - assert 201 == 413 FAILED ..\test\test_api.py::test_read_watermark_route - AssertionError: asser... 2 failed, 12 passed, 22 warnings in 20.49s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_731"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_731_1" aria-expanded="false" aria-controls="job_list___sub_collapse_731_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_731_1"><button class="btn btn-outline-danger"><span class="job_id">731 : Job ID 89d396413cd641798c150fe6c95212ca</span></button></div></a><div aria-labelledby="job_list___sub_heading_731_1" data-parent="#job_list___sub_accordion_731" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_731_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=313" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (313, 24), end pos: (313, 26)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 47</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -310,7 +310,7 @@ start_db = time.time() # Validate file size - MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB + MAX_FILE_SIZE = 49 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.18s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_732"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_732_1" aria-expanded="false" aria-controls="job_list___sub_collapse_732_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_732_1"><button class="btn btn-outline-success"><span class="job_id">732 : Job ID e47c9dd1a2354d8bb65efac7b630c845</span></button></div></a><div aria-labelledby="job_list___sub_heading_732_1" data-parent="#job_list___sub_accordion_732" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_732_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=313" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (313, 29), end pos: (313, 33)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 48</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -310,7 +310,7 @@ start_db = time.time() # Validate file size - MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB + MAX_FILE_SIZE = 50 * 1025 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T012216549159Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T012217484452Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.37s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_733"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_733_1" aria-expanded="false" aria-controls="job_list___sub_collapse_733_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_733_1"><button class="btn btn-outline-success"><span class="job_id">733 : Job ID 4f004b5380e4483ba896d786e239a6b7</span></button></div></a><div aria-labelledby="job_list___sub_heading_733_1" data-parent="#job_list___sub_accordion_733" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_733_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=313" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (313, 29), end pos: (313, 33)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 49</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -310,7 +310,7 @@ start_db = time.time() # Validate file size - MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB + MAX_FILE_SIZE = 50 * 1023 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T002851898070Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T002852804537Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.32s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_734"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_734_1" aria-expanded="false" aria-controls="job_list___sub_collapse_734_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_734_1"><button class="btn btn-outline-success"><span class="job_id">734 : Job ID 6a8975a78f3b48d78157af5d478f3cf4</span></button></div></a><div aria-labelledby="job_list___sub_heading_734_1" data-parent="#job_list___sub_accordion_734" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_734_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=313" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (313, 36), end pos: (313, 40)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 50</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -310,7 +310,7 @@ start_db = time.time() # Validate file size - MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB + MAX_FILE_SIZE = 50 * 1024 * 1025 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename)</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ee6edbc3f5f8f5f99: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.76s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_735"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_735_1" aria-expanded="false" aria-controls="job_list___sub_collapse_735_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_735_1"><button class="btn btn-outline-danger"><span class="job_id">735 : Job ID 1cd02bf233204cb286eea8b0f5f465ea</span></button></div></a><div aria-labelledby="job_list___sub_heading_735_1" data-parent="#job_list___sub_accordion_735" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_735_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=313" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (313, 36), end pos: (313, 40)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 51</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -310,7 +310,7 @@ start_db = time.time() # Validate file size - MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB + MAX_FILE_SIZE = 50 * 1024 * 1023 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.11s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_736"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_736_1" aria-expanded="false" aria-controls="job_list___sub_collapse_736_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_736_1"><button class="btn btn-outline-success"><span class="job_id">736 : Job ID 3fe62b7f991342d59c1afa8b0105cbec</span></button></div></a><div aria-labelledby="job_list___sub_heading_736_1" data-parent="#job_list___sub_accordion_736" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_736_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=317" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (317, 57), end pos: (317, 60)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 52</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -314,7 +314,7 @@ if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) - return jsonify({"error": "file too large"}), 413 + return jsonify({"error": "file too large"}), 414 # Validate file type and MIME type if file.mimetype != "application/pdf":</pre></div><div class="alert alert-secondary"><pre class="diff">...F.......... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') &gt; assert resp.status_code == 413 E assert 414 == 413 E + where 414 = &lt;WrapperTestResponse streamed [414 REQUEST URI TOO LONG]&gt;.status_code ..\test\test_api.py:181: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field WARNING server:server.py:316 Upload attempt with oversized file: bigfile.pdf ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - assert 414 == 413 1 failed, 13 passed, 22 warnings in 20.82s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_737"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_737_1" aria-expanded="false" aria-controls="job_list___sub_collapse_737_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_737_1"><button class="btn btn-outline-success"><span class="job_id">737 : Job ID 26acd76158ec4b1fa25f31a762b42dd8</span></button></div></a><div aria-labelledby="job_list___sub_heading_737_1" data-parent="#job_list___sub_accordion_737" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_737_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=317" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (317, 57), end pos: (317, 60)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 53</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -314,7 +314,7 @@ if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) - return jsonify({"error": "file too large"}), 413 + return jsonify({"error": "file too large"}), 412 # Validate file type and MIME type if file.mimetype != "application/pdf":</pre></div><div class="alert alert-secondary"><pre class="diff">...F.......... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') &gt; assert resp.status_code == 413 E assert 412 == 413 E + where 412 = &lt;WrapperTestResponse streamed [412 PRECONDITION FAILED]&gt;.status_code ..\test\test_api.py:181: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field WARNING server:server.py:316 Upload attempt with oversized file: bigfile.pdf ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - assert 412 == 413 1 failed, 13 passed, 22 warnings in 21.12s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_738"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_738_1" aria-expanded="false" aria-controls="job_list___sub_collapse_738_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_738_1"><button class="btn btn-outline-success"><span class="job_id">738 : Job ID 50cd3765cfc7468b81d5225f162273e3</span></button></div></a><div aria-labelledby="job_list___sub_heading_738_1" data-parent="#job_list___sub_accordion_738" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_738_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=325" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (325, 69), end pos: (325, 72)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 54</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -322,7 +322,7 @@ app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) - return jsonify({"error": "only PDF files are allowed"}), 415 + return jsonify({"error": "only PDF files are allowed"}), 416 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning(</pre></div><div class="alert alert-secondary"><pre class="diff">...F.......... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') assert resp.status_code == 413 #Test with type error, txt file resp = client.post("/api/upload-document", data={'file': (BytesIO(b"example"), "test.txt", "text/plain"), 'name': 'file'}, content_type='multipart/form-data') &gt; assert resp.status_code == 415 E assert 416 == 415 E + where 416 = &lt;WrapperTestResponse streamed [416 REQUESTED RANGE NOT SATISFIABLE]&gt;.status_code ..\test\test_api.py:188: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field WARNING server:server.py:316 Upload attempt with oversized file: bigfile.pdf WARNING server:server.py:322 Upload attempt with invalid MIME type: text/plain ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - assert 416 == 415 1 failed, 13 passed, 22 warnings in 20.55s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_739"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_739_1" aria-expanded="false" aria-controls="job_list___sub_collapse_739_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_739_1"><button class="btn btn-outline-success"><span class="job_id">739 : Job ID c4b37f53dc1d47988ce650fedfe7f6a7</span></button></div></a><div aria-labelledby="job_list___sub_heading_739_1" data-parent="#job_list___sub_accordion_739" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_739_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=325" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (325, 69), end pos: (325, 72)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 55</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -322,7 +322,7 @@ app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) - return jsonify({"error": "only PDF files are allowed"}), 415 + return jsonify({"error": "only PDF files are allowed"}), 414 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning(</pre></div><div class="alert alert-secondary"><pre class="diff">...F.......... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') assert resp.status_code == 413 #Test with type error, txt file resp = client.post("/api/upload-document", data={'file': (BytesIO(b"example"), "test.txt", "text/plain"), 'name': 'file'}, content_type='multipart/form-data') &gt; assert resp.status_code == 415 E assert 414 == 415 E + where 414 = &lt;WrapperTestResponse streamed [414 REQUEST URI TOO LONG]&gt;.status_code ..\test\test_api.py:188: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field WARNING server:server.py:316 Upload attempt with oversized file: bigfile.pdf WARNING server:server.py:322 Upload attempt with invalid MIME type: text/plain ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - assert 414 == 415 1 failed, 13 passed, 22 warnings in 20.48s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_740"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_740_1" aria-expanded="false" aria-controls="job_list___sub_collapse_740_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_740_1"><button class="btn btn-outline-danger"><span class="job_id">740 : Job ID 03497271e2cf405cb36ab592c8b7aa50</span></button></div></a><div aria-labelledby="job_list___sub_heading_740_1" data-parent="#job_list___sub_accordion_740" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_740_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=331" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (331, 69), end pos: (331, 72)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 56</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -328,7 +328,7 @@ app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) - return jsonify({"error": "only PDF files are allowed"}), 415 + return jsonify({"error": "only PDF files are allowed"}), 416 # Sanitize filename fname = secure_filename(file.filename)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.29s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_741"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_741_1" aria-expanded="false" aria-controls="job_list___sub_collapse_741_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_741_1"><button class="btn btn-outline-danger"><span class="job_id">741 : Job ID 588a904a2c094205b5413e866f5e710c</span></button></div></a><div aria-labelledby="job_list___sub_heading_741_1" data-parent="#job_list___sub_accordion_741" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_741_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=331" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (331, 69), end pos: (331, 72)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 57</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -328,7 +328,7 @@ app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) - return jsonify({"error": "only PDF files are allowed"}), 415 + return jsonify({"error": "only PDF files are allowed"}), 414 # Sanitize filename fname = secure_filename(file.filename)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.85s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_742"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_742_1" aria-expanded="false" aria-controls="job_list___sub_collapse_742_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_742_1"><button class="btn btn-outline-success"><span class="job_id">742 : Job ID a324b3e76a774becbe14df5a492ec833</span></button></div></a><div aria-labelledby="job_list___sub_heading_742_1" data-parent="#job_list___sub_accordion_742" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_742_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=339" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (339, 59), end pos: (339, 62)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 58</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -336,7 +336,7 @@ app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) - return jsonify({"error": "invalid filename"}), 400 + return jsonify({"error": "invalid filename"}), 401 user_dir = app.config["STORAGE_DIR"] / "files" / g.user["login"] user_dir.mkdir(parents=True, exist_ok=True)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T211920110409Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T211921047035Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.39s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_743"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_743_1" aria-expanded="false" aria-controls="job_list___sub_collapse_743_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_743_1"><button class="btn btn-outline-success"><span class="job_id">743 : Job ID 3084e2b6e8fd4646a606b4423181b45e</span></button></div></a><div aria-labelledby="job_list___sub_heading_743_1" data-parent="#job_list___sub_accordion_743" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_743_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=339" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (339, 59), end pos: (339, 62)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 59</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -336,7 +336,7 @@ app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) - return jsonify({"error": "invalid filename"}), 400 + return jsonify({"error": "invalid filename"}), 399 user_dir = app.config["STORAGE_DIR"] / "files" / g.user["login"] user_dir.mkdir(parents=True, exist_ok=True)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T153223671244Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T153224599563Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.50s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_744"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_744_1" aria-expanded="false" aria-controls="job_list___sub_collapse_744_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_744_1"><button class="btn btn-outline-danger"><span class="job_id">744 : Job ID d5ac3a8bf28c4d9daf8f84e0115b9e20</span></button></div></a><div aria-labelledby="job_list___sub_heading_744_1" data-parent="#job_list___sub_accordion_744" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_744_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=353" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (353, 59), end pos: (353, 62)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 60</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -350,7 +350,7 @@ stored_path = (user_dir / stored_name).resolve() if not str(stored_path).startswith(str(user_dir.resolve())): app.logger.warning("Upload attempt with invalid path: %s", stored_path) - return jsonify({"error": "invalid path"}), 400 + return jsonify({"error": "invalid path"}), 401 file.save(stored_path) except Exception as e:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.55s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_745"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_745_1" aria-expanded="false" aria-controls="job_list___sub_collapse_745_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_745_1"><button class="btn btn-outline-success"><span class="job_id">745 : Job ID 6a59bd90bfcf422192c9ed7ac38b0e83</span></button></div></a><div aria-labelledby="job_list___sub_heading_745_1" data-parent="#job_list___sub_accordion_745" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_745_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=353" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (353, 59), end pos: (353, 62)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 61</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -350,7 +350,7 @@ stored_path = (user_dir / stored_name).resolve() if not str(stored_path).startswith(str(user_dir.resolve())): app.logger.warning("Upload attempt with invalid path: %s", stored_path) - return jsonify({"error": "invalid path"}), 400 + return jsonify({"error": "invalid path"}), 399 file.save(stored_path) except Exception as e:</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e0f8995d44a152f07: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.74s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_746"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_746_1" aria-expanded="false" aria-controls="job_list___sub_collapse_746_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_746_1"><button class="btn btn-outline-danger"><span class="job_id">746 : Job ID 94ec809e27514208a0944e6879684dee</span></button></div></a><div aria-labelledby="job_list___sub_heading_746_1" data-parent="#job_list___sub_accordion_746" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_746_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=358" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (358, 62), end pos: (358, 65)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 62</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -355,7 +355,7 @@ file.save(stored_path) except Exception as e: app.logger.error("File save error: %s", e) - return jsonify({"error": "failed to save file"}), 500 + return jsonify({"error": "failed to save file"}), 501 sha_hex = _sha256_file(stored_path) size = stored_path.stat().st_size</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.45s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_747"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_747_1" aria-expanded="false" aria-controls="job_list___sub_collapse_747_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_747_1"><button class="btn btn-outline-success"><span class="job_id">747 : Job ID 21d4e3083e76444fbe26fb093466544d</span></button></div></a><div aria-labelledby="job_list___sub_heading_747_1" data-parent="#job_list___sub_accordion_747" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_747_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=358" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (358, 62), end pos: (358, 65)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 63</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -355,7 +355,7 @@ file.save(stored_path) except Exception as e: app.logger.error("File save error: %s", e) - return jsonify({"error": "failed to save file"}), 500 + return jsonify({"error": "failed to save file"}), 499 sha_hex = _sha256_file(stored_path) size = stored_path.stat().st_size</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T151346271973Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T151347120197Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.31s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_748"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_748_1" aria-expanded="false" aria-controls="job_list___sub_collapse_748_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_748_1"><button class="btn btn-outline-success"><span class="job_id">748 : Job ID 500e32d3ea9c4781aea3a49cb23e5ba5</span></button></div></a><div aria-labelledby="job_list___sub_heading_748_1" data-parent="#job_list___sub_accordion_748" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_748_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=399" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (399, 66), end pos: (399, 69)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 64</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -396,7 +396,7 @@ int(g.user["id"]), ) inc_db_error("insert_document") - return jsonify({"error": "database error occurred"}), 503 + return jsonify({"error": "database error occurred"}), 504 observe_db_latency("insert_document", time.time() - start_db) resp_data = {</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 504 == 201 E + where 504 = &lt;WrapperTestResponse 36 bytes [504 GATEWAY TIMEOUT]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T010807341417Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 504 == 201 E + where 504 = &lt;WrapperTestResponse 36 bytes [504 GATEWAY TIMEOUT]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T010808181613Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 504 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 504 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.51s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_749"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_749_1" aria-expanded="false" aria-controls="job_list___sub_collapse_749_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_749_1"><button class="btn btn-outline-danger"><span class="job_id">749 : Job ID 0a5f27f8bb86444187be4b6d5e4c87dc</span></button></div></a><div aria-labelledby="job_list___sub_heading_749_1" data-parent="#job_list___sub_accordion_749" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_749_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=399" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (399, 66), end pos: (399, 69)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 65</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -396,7 +396,7 @@ int(g.user["id"]), ) inc_db_error("insert_document") - return jsonify({"error": "database error occurred"}), 503 + return jsonify({"error": "database error occurred"}), 502 observe_db_latency("insert_document", time.time() - start_db) resp_data = {</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.11s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_750"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_750_1" aria-expanded="false" aria-controls="job_list___sub_collapse_750_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_750_1"><button class="btn btn-outline-success"><span class="job_id">750 : Job ID c460a73ab3384220babbc0676d27c363</span></button></div></a><div aria-labelledby="job_list___sub_heading_750_1" data-parent="#job_list___sub_accordion_750" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_750_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=412" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (412, 35), end pos: (412, 38)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 66</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -409,7 +409,7 @@ "size": int(row.size), } inc_upload(int(row.size)) - return jsonify(resp_data), 201 + return jsonify(resp_data), 202 # GET /api/list-documents @app.get("/api/list-documents")</pre></div><div class="alert alert-secondary"><pre class="diff">...F......F... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 202 == 201 E + where 202 = &lt;WrapperTestResponse 155 bytes [202 ACCEPTED]&gt;.status_code ..\test\test_api.py:152: AssertionError __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 202 == 201 E + where 202 = &lt;WrapperTestResponse 158 bytes [202 ACCEPTED]&gt;.status_code ..\test\test_api.py:389: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - assert 202 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 202 == 201 2 failed, 12 passed, 22 warnings in 20.37s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_751"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_751_1" aria-expanded="false" aria-controls="job_list___sub_collapse_751_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_751_1"><button class="btn btn-outline-success"><span class="job_id">751 : Job ID c6f12e3a8a9d4123bc6eab8203fa3c75</span></button></div></a><div aria-labelledby="job_list___sub_heading_751_1" data-parent="#job_list___sub_accordion_751" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_751_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=412" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (412, 35), end pos: (412, 38)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 67</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -409,7 +409,7 @@ "size": int(row.size), } inc_upload(int(row.size)) - return jsonify(resp_data), 201 + return jsonify(resp_data), 200 # GET /api/list-documents @app.get("/api/list-documents")</pre></div><div class="alert alert-secondary"><pre class="diff">...F......F... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 200 == 201 E + where 200 = &lt;WrapperTestResponse 155 bytes [200 OK]&gt;.status_code ..\test\test_api.py:152: AssertionError __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 200 == 201 E + where 200 = &lt;WrapperTestResponse 158 bytes [200 OK]&gt;.status_code ..\test\test_api.py:389: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - assert 200 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 200 == 201 2 failed, 12 passed, 22 warnings in 19.53s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_752"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_752_1" aria-expanded="false" aria-controls="job_list___sub_collapse_752_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_752_1"><button class="btn btn-outline-danger"><span class="job_id">752 : Job ID 5e16322ca1dc436783b1e9aa31725213</span></button></div></a><div aria-labelledby="job_list___sub_heading_752_1" data-parent="#job_list___sub_accordion_752" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_752_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=436" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (436, 85), end pos: (436, 88)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 68</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -433,7 +433,7 @@ "Database error in list_documents for user=%s", g.user["id"] ) inc_db_error("list_documents") - return jsonify({"error": "An error occurred while fetching documents"}), 503 + return jsonify({"error": "An error occurred while fetching documents"}), 504 docs = [ {</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.33s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_753"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_753_1" aria-expanded="false" aria-controls="job_list___sub_collapse_753_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_753_1"><button class="btn btn-outline-danger"><span class="job_id">753 : Job ID d29d9b5a8e3d405eb0fe91717e35f92e</span></button></div></a><div aria-labelledby="job_list___sub_heading_753_1" data-parent="#job_list___sub_accordion_753" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_753_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=436" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (436, 85), end pos: (436, 88)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 69</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -433,7 +433,7 @@ "Database error in list_documents for user=%s", g.user["id"] ) inc_db_error("list_documents") - return jsonify({"error": "An error occurred while fetching documents"}), 503 + return jsonify({"error": "An error occurred while fetching documents"}), 502 docs = [ {</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.11s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_754"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_754_1" aria-expanded="false" aria-controls="job_list___sub_collapse_754_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_754_1"><button class="btn btn-outline-success"><span class="job_id">754 : Job ID 895cd95dd4004280a975fd87b1d61dc0</span></button></div></a><div aria-labelledby="job_list___sub_heading_754_1" data-parent="#job_list___sub_accordion_754" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_754_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=450" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (450, 45), end pos: (450, 48)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 70</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -447,7 +447,7 @@ } for r in rows ] - return jsonify({"documents": docs}), 200 + return jsonify({"documents": docs}), 201 # GET /api/list-versions @app.get("/api/list-versions")</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T034525972219Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 201 == 200 E + where 201 = &lt;WrapperTestResponse 17 bytes [201 CREATED]&gt;.status_code ..\test\test_api.py:198: AssertionError __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T034526875484Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 201 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.43s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_755"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_755_1" aria-expanded="false" aria-controls="job_list___sub_collapse_755_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_755_1"><button class="btn btn-outline-success"><span class="job_id">755 : Job ID 50e61ad7911f4a8b8b9f63484774aead</span></button></div></a><div aria-labelledby="job_list___sub_heading_755_1" data-parent="#job_list___sub_accordion_755" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_755_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=450" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (450, 45), end pos: (450, 48)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 71</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -447,7 +447,7 @@ } for r in rows ] - return jsonify({"documents": docs}), 200 + return jsonify({"documents": docs}), 199 # GET /api/list-versions @app.get("/api/list-versions")</pre></div><div class="alert alert-secondary"><pre class="diff">....F......... [100%] ================================== FAILURES =================================== __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") &gt; resp_data = resp.get_json() ^^^^^^^^^^^^^^^ ..\test\test_api.py:195: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\response.py:620: in get_json return self.json_module.loads(data) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\json\provider.py:187: in loads return json.loads(s, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\json\__init__.py:346: in loads return _default_decoder.decode(s) ^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\json\decoder.py:337: in decode obj, end = self.raw_decode(s, idx=_w(s, 0).end()) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = &lt;json.decoder.JSONDecoder object at 0x000002348424C5F0&gt;, s = '', idx = 0 def raw_decode(self, s, idx=0): """Decode a JSON document from ``s`` (a ``str`` beginning with a JSON document) and return a 2-tuple of the Python representation and the index in ``s`` where the document ended. This can be used to decode a JSON document from a string that may have extraneous data at the end. """ try: obj, end = self.scan_once(s, idx) except StopIteration as err: &gt; raise JSONDecodeError("Expecting value", s, err.value) from None E json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\json\decoder.py:355: JSONDecodeError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_list_documents_route - json.decoder.JSONDeco... 1 failed, 13 passed, 22 warnings in 21.77s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_756"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_756_1" aria-expanded="false" aria-controls="job_list___sub_collapse_756_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_756_1"><button class="btn btn-outline-success"><span class="job_id">756 : Job ID 003a855b0fef419382dae0565ff9d1b3</span></button></div></a><div aria-labelledby="job_list___sub_heading_756_1" data-parent="#job_list___sub_accordion_756" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_756_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=462" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (462, 57), end pos: (462, 58)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 72</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -459,7 +459,7 @@ document_id = request.args.get("id") or request.args.get("documentid") try: document_id = int(document_id) if document_id else None - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is None or document_id &lt;= 1 or document_id &gt; MAX_DB_INT: app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 except (TypeError, ValueError):</pre></div><div class="alert alert-secondary"><pre class="diff">.....F........ [100%] ================================== FAILURES =================================== __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse 33 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:463 Invalid document id in query ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_list_versions_route - assert 400 == 200 1 failed, 13 passed, 22 warnings in 20.75s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_757"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_757_1" aria-expanded="false" aria-controls="job_list___sub_collapse_757_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_757_1"><button class="btn btn-outline-danger"><span class="job_id">757 : Job ID a39c5dd496f04cb8a7e7a3ea44c5845a</span></button></div></a><div aria-labelledby="job_list___sub_heading_757_1" data-parent="#job_list___sub_accordion_757" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_757_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=462" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (462, 57), end pos: (462, 58)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 73</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -459,7 +459,7 @@ document_id = request.args.get("id") or request.args.get("documentid") try: document_id = int(document_id) if document_id else None - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is None or document_id &lt;= -1 or document_id &gt; MAX_DB_INT: app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 except (TypeError, ValueError):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.97s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_758"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_758_1" aria-expanded="false" aria-controls="job_list___sub_collapse_758_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_758_1"><button class="btn btn-outline-success"><span class="job_id">758 : Job ID 92b7620090ab4e34b5286be30e1e58cf</span></button></div></a><div aria-labelledby="job_list___sub_heading_758_1" data-parent="#job_list___sub_accordion_758" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_758_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=464" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (464, 71), end pos: (464, 74)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 74</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -461,7 +461,7 @@ document_id = int(document_id) if document_id else None if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: app.logger.warning("Invalid document id in query") - return jsonify({"error": "document id required"}), 400 + return jsonify({"error": "document id required"}), 401 except (TypeError, ValueError): app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400</pre></div><div class="alert alert-secondary"><pre class="diff">...F.F...FFF.F [100%]</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_759"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_759_1" aria-expanded="false" aria-controls="job_list___sub_collapse_759_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_759_1"><button class="btn btn-outline-success"><span class="job_id">759 : Job ID f1a42c2662c947098320ed8a7ab2b7a6</span></button></div></a><div aria-labelledby="job_list___sub_heading_759_1" data-parent="#job_list___sub_accordion_759" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_759_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=464" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (464, 71), end pos: (464, 74)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 75</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -461,7 +461,7 @@ document_id = int(document_id) if document_id else None if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: app.logger.warning("Invalid document id in query") - return jsonify({"error": "document id required"}), 400 + return jsonify({"error": "document id required"}), 399 except (TypeError, ValueError): app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400</pre></div><div class="alert alert-secondary"><pre class="diff">.....F........ [100%] ================================== FAILURES =================================== __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests assert resp.status_code == 200 assert resp.is_json #check types #extract data doc_list = resp_data.get("versions") assert isinstance(doc_list, list) #cycle through each element in the list for elem in doc_list: assert isinstance(elem.get("id"), str) assert isinstance(elem.get("documentid"), str) #check the version is from the correct document assert elem.get("documentid") == str(parameters["documentid"]) assert isinstance(elem.get("link"), str) assert isinstance(elem.get("intended_for"), str) assert isinstance(elem.get("secret"), str) assert isinstance(elem.get("method"), str) #Test with no parameters resp = client.get("/api/list-versions") &gt; assert resp.status_code == 400 E assert 399 == 400 E + where 399 = &lt;WrapperTestResponse streamed [399 UNKNOWN]&gt;.status_code ..\test\test_api.py:239: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:463 Invalid document id in query ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_list_versions_route - assert 399 == 400 1 failed, 13 passed, 22 warnings in 20.80s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_760"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_760_1" aria-expanded="false" aria-controls="job_list___sub_collapse_760_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_760_1"><button class="btn btn-outline-success"><span class="job_id">760 : Job ID 53bd3ad396bf40a78afe1353f0942998</span></button></div></a><div aria-labelledby="job_list___sub_heading_760_1" data-parent="#job_list___sub_accordion_760" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_760_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=467" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (467, 67), end pos: (467, 70)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 76</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -464,7 +464,7 @@ return jsonify({"error": "document id required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id in query") - return jsonify({"error": "document id required"}), 400 + return jsonify({"error": "document id required"}), 401 if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: return jsonify({"error": "document id required"}), 400</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T000729227978Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T000730197742Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.35s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_761"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_761_1" aria-expanded="false" aria-controls="job_list___sub_collapse_761_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_761_1"><button class="btn btn-outline-success"><span class="job_id">761 : Job ID d584b1e2759e4922a0fcd3a09cb3ad6e</span></button></div></a><div aria-labelledby="job_list___sub_heading_761_1" data-parent="#job_list___sub_accordion_761" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_761_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=467" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (467, 67), end pos: (467, 70)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 77</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -464,7 +464,7 @@ return jsonify({"error": "document id required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id in query") - return jsonify({"error": "document id required"}), 400 + return jsonify({"error": "document id required"}), 399 if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: return jsonify({"error": "document id required"}), 400</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 4 failed, 10 passed, 22 warnings in 21.34s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_762"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_762_1" aria-expanded="false" aria-controls="job_list___sub_collapse_762_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_762_1"><button class="btn btn-outline-success"><span class="job_id">762 : Job ID 93a2f12ec79e49329eac774866a70b52</span></button></div></a><div aria-labelledby="job_list___sub_heading_762_1" data-parent="#job_list___sub_accordion_762" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_762_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=469" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (469, 49), end pos: (469, 50)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 78</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -466,7 +466,7 @@ app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is None or document_id &lt;= 1 or document_id &gt; MAX_DB_INT: return jsonify({"error": "document id required"}), 400 try:</pre></div><div class="alert alert-secondary"><pre class="diff">.....F........ [100%] ================================== FAILURES =================================== __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse 33 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:220: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_list_versions_route - assert 400 == 200 1 failed, 13 passed, 22 warnings in 20.58s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_763"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_763_1" aria-expanded="false" aria-controls="job_list___sub_collapse_763_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_763_1"><button class="btn btn-outline-danger"><span class="job_id">763 : Job ID de52142c061f4038adae8009374b1991</span></button></div></a><div aria-labelledby="job_list___sub_heading_763_1" data-parent="#job_list___sub_accordion_763" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_763_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=469" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (469, 49), end pos: (469, 50)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 79</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -466,7 +466,7 @@ app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is None or document_id &lt;= -1 or document_id &gt; MAX_DB_INT: return jsonify({"error": "document id required"}), 400 try:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.01s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_764"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_764_1" aria-expanded="false" aria-controls="job_list___sub_collapse_764_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_764_1"><button class="btn btn-outline-danger"><span class="job_id">764 : Job ID 4ccdefcacf2645f5900c4b0695468dab</span></button></div></a><div aria-labelledby="job_list___sub_heading_764_1" data-parent="#job_list___sub_accordion_764" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_764_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=470" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (470, 63), end pos: (470, 66)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 80</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -467,7 +467,7 @@ return jsonify({"error": "document id required"}), 400 if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: - return jsonify({"error": "document id required"}), 400 + return jsonify({"error": "document id required"}), 401 try: with get_engine().connect() as conn:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 23.13s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_765"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_765_1" aria-expanded="false" aria-controls="job_list___sub_collapse_765_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_765_1"><button class="btn btn-outline-danger"><span class="job_id">765 : Job ID b24e2e4c42964088ba8db44c2920e99e</span></button></div></a><div aria-labelledby="job_list___sub_heading_765_1" data-parent="#job_list___sub_accordion_765" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_765_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=470" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (470, 63), end pos: (470, 66)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 81</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -467,7 +467,7 @@ return jsonify({"error": "document id required"}), 400 if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: - return jsonify({"error": "document id required"}), 400 + return jsonify({"error": "document id required"}), 399 try: with get_engine().connect() as conn:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.26s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_766"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_766_1" aria-expanded="false" aria-controls="job_list___sub_collapse_766_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_766_1"><button class="btn btn-outline-success"><span class="job_id">766 : Job ID f79accf6682b440c85aba4919afda960</span></button></div></a><div aria-labelledby="job_list___sub_heading_766_1" data-parent="#job_list___sub_accordion_766" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_766_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=489" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (489, 69), end pos: (489, 72)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 82</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -486,7 +486,7 @@ app.logger.warning( "Document not found or access denied for id=%s", document_id ) - return jsonify({"error": "document not found"}), 404 + return jsonify({"error": "document not found"}), 405 # Then fetch versions with ownership validation rows = conn.execute(</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T053026164838Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T053027100307Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.90s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_767"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_767_1" aria-expanded="false" aria-controls="job_list___sub_collapse_767_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_767_1"><button class="btn btn-outline-success"><span class="job_id">767 : Job ID b1b4fa9cfafe49bb8900fa4fb1da6bcf</span></button></div></a><div aria-labelledby="job_list___sub_heading_767_1" data-parent="#job_list___sub_accordion_767" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_767_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=489" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (489, 69), end pos: (489, 72)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 83</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -486,7 +486,7 @@ app.logger.warning( "Document not found or access denied for id=%s", document_id ) - return jsonify({"error": "document not found"}), 404 + return jsonify({"error": "document not found"}), 403 # Then fetch versions with ownership validation rows = conn.execute(</pre></div><div class="alert alert-secondary"><pre class="diff">...F.F...FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests assert resp.status_code == 200 assert resp.is_json #check types #extract data doc_list = resp_data.get("versions") assert isinstance(doc_list, list) #cycle through each element in the list for elem in doc_list: assert isinstance(elem.get("id"), str) assert isinstance(elem.get("documentid"), str) #check the version is from the correct document assert elem.get("documentid") == str(parameters["documentid"]) assert isinstance(elem.get("link"), str) assert isinstance(elem.get("intended_for"), str) assert isinstance(elem.get("secret"), str) assert isinstance(elem.get("method"), str) #Test with no parameters resp = client.get("/api/list-versions") assert resp.status_code == 400 #Test with json parameters resp = client.get("/api/list-versions", json = parameters) assert resp.status_code == 400 #Test with wrong parameters (missing file) resp = client.get("/api/list-versions", query_string = {'documentid': 4}) &gt; assert resp.status_code == 404 E assert 403 == 404 E + where 403 = &lt;WrapperTestResponse streamed [403 FORBIDDEN]&gt;.status_code ..\test\test_api.py:245: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:463 Invalid document id in query WARNING server:server.py:463 Invalid document id in query WARNING server:server.py:486 Document not found or access denied for id=4 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ebfc2f16c61f41af3: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_list_versions_route - assert 403 == 404 FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 6 failed, 8 passed, 22 warnings in 19.71s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_768"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_768_1" aria-expanded="false" aria-controls="job_list___sub_collapse_768_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_768_1"><button class="btn btn-outline-danger"><span class="job_id">768 : Job ID 70fe749f539344a0bcfb932b2e1bae1a</span></button></div></a><div aria-labelledby="job_list___sub_heading_768_1" data-parent="#job_list___sub_accordion_768" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_768_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=508" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (508, 84), end pos: (508, 87)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 84</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -505,7 +505,7 @@ f"Database error in list_versions: {document_id},{g.user['id']}" ) inc_db_error("list_versions") - return jsonify({"error": "An error occurred while fetching versions"}), 503 + return jsonify({"error": "An error occurred while fetching versions"}), 504 versions = [ {</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.21s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_769"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_769_1" aria-expanded="false" aria-controls="job_list___sub_collapse_769_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_769_1"><button class="btn btn-outline-danger"><span class="job_id">769 : Job ID f8c63b3fbefe42ee8a0f607502518854</span></button></div></a><div aria-labelledby="job_list___sub_heading_769_1" data-parent="#job_list___sub_accordion_769" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_769_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=508" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (508, 84), end pos: (508, 87)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 85</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -505,7 +505,7 @@ f"Database error in list_versions: {document_id},{g.user['id']}" ) inc_db_error("list_versions") - return jsonify({"error": "An error occurred while fetching versions"}), 503 + return jsonify({"error": "An error occurred while fetching versions"}), 502 versions = [ {</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.73s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_770"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_770_1" aria-expanded="false" aria-controls="job_list___sub_collapse_770_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_770_1"><button class="btn btn-outline-success"><span class="job_id">770 : Job ID 2840c7136aa84557a6593856184bd807</span></button></div></a><div aria-labelledby="job_list___sub_heading_770_1" data-parent="#job_list___sub_accordion_770" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_770_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=521" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (521, 48), end pos: (521, 51)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 86</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -518,7 +518,7 @@ } for r in rows ] - return jsonify({"versions": versions}), 200 + return jsonify({"versions": versions}), 201 # GET /api/list-all-versions @app.get("/api/list-all-versions")</pre></div><div class="alert alert-secondary"><pre class="diff">.....F........ [100%] ================================== FAILURES =================================== __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 201 == 200 E + where 201 = &lt;WrapperTestResponse 16 bytes [201 CREATED]&gt;.status_code ..\test\test_api.py:220: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_list_versions_route - assert 201 == 200 1 failed, 13 passed, 22 warnings in 20.69s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_771"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_771_1" aria-expanded="false" aria-controls="job_list___sub_collapse_771_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_771_1"><button class="btn btn-outline-success"><span class="job_id">771 : Job ID 36fae3e0a8fe4453b1ea5a1d7e84fb06</span></button></div></a><div aria-labelledby="job_list___sub_heading_771_1" data-parent="#job_list___sub_accordion_771" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_771_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=521" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (521, 48), end pos: (521, 51)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 87</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -518,7 +518,7 @@ } for r in rows ] - return jsonify({"versions": versions}), 200 + return jsonify({"versions": versions}), 199 # GET /api/list-all-versions @app.get("/api/list-all-versions")</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T015415827559Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T015416801494Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.65s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_772"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_772_1" aria-expanded="false" aria-controls="job_list___sub_collapse_772_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_772_1"><button class="btn btn-outline-danger"><span class="job_id">772 : Job ID b87e495a2d0248cea0d4098c042356da</span></button></div></a><div aria-labelledby="job_list___sub_heading_772_1" data-parent="#job_list___sub_accordion_772" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_772_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=531" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (531, 69), end pos: (531, 72)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 88</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -528,7 +528,7 @@ # Validate user data from auth token if not g.user or not g.user.get("id"): app.logger.error("Missing user info in auth token") - return jsonify({"error": "Invalid authentication"}), 401 + return jsonify({"error": "Invalid authentication"}), 402 with get_engine().connect() as conn: rows = conn.execute(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.20s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_773"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_773_1" aria-expanded="false" aria-controls="job_list___sub_collapse_773_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_773_1"><button class="btn btn-outline-danger"><span class="job_id">773 : Job ID 4d673d480f394d5092c903e49bd4b0bc</span></button></div></a><div aria-labelledby="job_list___sub_heading_773_1" data-parent="#job_list___sub_accordion_773" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_773_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=531" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (531, 69), end pos: (531, 72)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 89</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -528,7 +528,7 @@ # Validate user data from auth token if not g.user or not g.user.get("id"): app.logger.error("Missing user info in auth token") - return jsonify({"error": "Invalid authentication"}), 401 + return jsonify({"error": "Invalid authentication"}), 400 with get_engine().connect() as conn: rows = conn.execute(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.45s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_774"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_774_1" aria-expanded="false" aria-controls="job_list___sub_collapse_774_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_774_1"><button class="btn btn-outline-danger"><span class="job_id">774 : Job ID 30d818245bc24a95add653681ffea444</span></button></div></a><div aria-labelledby="job_list___sub_heading_774_1" data-parent="#job_list___sub_accordion_774" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_774_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=549" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (549, 63), end pos: (549, 66)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 90</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -546,7 +546,7 @@ ).all() except ValueError: app.logger.error("Invalid user ID in auth token") - return jsonify({"error": "Authentication error"}), 401 + return jsonify({"error": "Authentication error"}), 402 except Exception: app.logger.error( "Database error in list_all_versions for user=%s", g.user["id"]</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.10s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_775"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_775_1" aria-expanded="false" aria-controls="job_list___sub_collapse_775_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_775_1"><button class="btn btn-outline-danger"><span class="job_id">775 : Job ID 9ea60f01ba1e44a49fe259c982de7b0e</span></button></div></a><div aria-labelledby="job_list___sub_heading_775_1" data-parent="#job_list___sub_accordion_775" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_775_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=549" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (549, 63), end pos: (549, 66)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 91</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -546,7 +546,7 @@ ).all() except ValueError: app.logger.error("Invalid user ID in auth token") - return jsonify({"error": "Authentication error"}), 401 + return jsonify({"error": "Authentication error"}), 400 except Exception: app.logger.error( "Database error in list_all_versions for user=%s", g.user["id"]</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.33s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_776"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_776_1" aria-expanded="false" aria-controls="job_list___sub_collapse_776_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_776_1"><button class="btn btn-outline-success"><span class="job_id">776 : Job ID 318a15a7591a4dfbbdb6c940dc26d966</span></button></div></a><div aria-labelledby="job_list___sub_heading_776_1" data-parent="#job_list___sub_accordion_776" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_776_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=555" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (555, 84), end pos: (555, 87)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 92</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -552,7 +552,7 @@ "Database error in list_all_versions for user=%s", g.user["id"] ) inc_db_error("list_all_versions") - return jsonify({"error": "An error occurred while fetching versions"}), 503 + return jsonify({"error": "An error occurred while fetching versions"}), 504 versions = [ {</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ef0706665929bfb4e: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 21.00s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_777"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_777_1" aria-expanded="false" aria-controls="job_list___sub_collapse_777_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_777_1"><button class="btn btn-outline-danger"><span class="job_id">777 : Job ID 06513d9af88d4b1795bfdd0469240555</span></button></div></a><div aria-labelledby="job_list___sub_heading_777_1" data-parent="#job_list___sub_accordion_777" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_777_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=555" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (555, 84), end pos: (555, 87)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 93</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -552,7 +552,7 @@ "Database error in list_all_versions for user=%s", g.user["id"] ) inc_db_error("list_all_versions") - return jsonify({"error": "An error occurred while fetching versions"}), 503 + return jsonify({"error": "An error occurred while fetching versions"}), 502 versions = [ {</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.75s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_778"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_778_1" aria-expanded="false" aria-controls="job_list___sub_collapse_778_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_778_1"><button class="btn btn-outline-success"><span class="job_id">778 : Job ID 7c853073924d4a5ba8591c3f78ed6d3c</span></button></div></a><div aria-labelledby="job_list___sub_heading_778_1" data-parent="#job_list___sub_accordion_778" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_778_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=567" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (567, 48), end pos: (567, 51)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 94</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -564,7 +564,7 @@ } for r in rows ] - return jsonify({"versions": versions}), 200 + return jsonify({"versions": versions}), 201 # GET /api/get-document or /api/get-document/&lt;id&gt;  returns the PDF (inline) @app.get("/api/get-document")</pre></div><div class="alert alert-secondary"><pre class="diff">......F....... [100%] ================================== FAILURES =================================== ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 201 == 200 E + where 201 = &lt;WrapperTestResponse 16 bytes [201 CREATED]&gt;.status_code ..\test\test_api.py:255: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_list_all_versions_route - assert 201 == 200 1 failed, 13 passed, 22 warnings in 22.10s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_779"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_779_1" aria-expanded="false" aria-controls="job_list___sub_collapse_779_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_779_1"><button class="btn btn-outline-success"><span class="job_id">779 : Job ID d2f765a0663d445b80974522e435cad6</span></button></div></a><div aria-labelledby="job_list___sub_heading_779_1" data-parent="#job_list___sub_accordion_779" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_779_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=567" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (567, 48), end pos: (567, 51)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 95</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -564,7 +564,7 @@ } for r in rows ] - return jsonify({"versions": versions}), 200 + return jsonify({"versions": versions}), 199 # GET /api/get-document or /api/get-document/&lt;id&gt;  returns the PDF (inline) @app.get("/api/get-document")</pre></div><div class="alert alert-secondary"><pre class="diff">......F....... [100%] ================================== FAILURES =================================== ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! &gt; resp_data = resp.get_json() ^^^^^^^^^^^^^^^ ..\test\test_api.py:252: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\response.py:620: in get_json return self.json_module.loads(data) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\json\provider.py:187: in loads return json.loads(s, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\json\__init__.py:346: in loads return _default_decoder.decode(s) ^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\json\decoder.py:337: in decode obj, end = self.raw_decode(s, idx=_w(s, 0).end()) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = &lt;json.decoder.JSONDecoder object at 0x000001AE876FC5F0&gt;, s = '', idx = 0 def raw_decode(self, s, idx=0): """Decode a JSON document from ``s`` (a ``str`` beginning with a JSON document) and return a 2-tuple of the Python representation and the index in ``s`` where the document ended. This can be used to decode a JSON document from a string that may have extraneous data at the end. """ try: obj, end = self.scan_once(s, idx) except StopIteration as err: &gt; raise JSONDecodeError("Expecting value", s, err.value) from None E json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\json\decoder.py:355: JSONDecodeError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_list_all_versions_route - json.decoder.JSOND... 1 failed, 13 passed, 22 warnings in 21.07s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_780"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_780_1" aria-expanded="false" aria-controls="job_list___sub_collapse_780_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_780_1"><button class="btn btn-outline-success"><span class="job_id">780 : Job ID 686ca0aaadd943108547f0d3ec39dd6a</span></button></div></a><div aria-labelledby="job_list___sub_heading_780_1" data-parent="#job_list___sub_accordion_780" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_780_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=581" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (581, 67), end pos: (581, 70)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 96</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -578,7 +578,7 @@ document_id = int(document_id) except (TypeError, ValueError): app.logger.warning("Invalid document id in query") - return jsonify({"error": "document id required"}), 400 + return jsonify({"error": "document id required"}), 401 if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: return jsonify({"error": "document id required"}), 400</pre></div><div class="alert alert-secondary"><pre class="diff">.......F...... [100%] ================================== FAILURES =================================== ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle assert is_pdf assert is_inline #Test with no parameters resp = client.get("/api/get-document") &gt; assert resp.status_code == 400 E assert 401 == 400 E + where 401 = &lt;WrapperTestResponse streamed [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:287: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:580 Invalid document id in query ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_get_document_route - assert 401 == 400 1 failed, 13 passed, 22 warnings in 20.67s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_781"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_781_1" aria-expanded="false" aria-controls="job_list___sub_collapse_781_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_781_1"><button class="btn btn-outline-success"><span class="job_id">781 : Job ID 58c8a66d1b1948ed85d4b8310f6322c7</span></button></div></a><div aria-labelledby="job_list___sub_heading_781_1" data-parent="#job_list___sub_accordion_781" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_781_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=581" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (581, 67), end pos: (581, 70)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 97</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -578,7 +578,7 @@ document_id = int(document_id) except (TypeError, ValueError): app.logger.warning("Invalid document id in query") - return jsonify({"error": "document id required"}), 400 + return jsonify({"error": "document id required"}), 399 if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: return jsonify({"error": "document id required"}), 400</pre></div><div class="alert alert-secondary"><pre class="diff">.......F...... [100%] ================================== FAILURES =================================== ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle assert is_pdf assert is_inline #Test with no parameters resp = client.get("/api/get-document") &gt; assert resp.status_code == 400 E assert 399 == 400 E + where 399 = &lt;WrapperTestResponse streamed [399 UNKNOWN]&gt;.status_code ..\test\test_api.py:287: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:580 Invalid document id in query ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_get_document_route - assert 399 == 400 1 failed, 13 passed, 22 warnings in 20.27s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_782"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_782_1" aria-expanded="false" aria-controls="job_list___sub_collapse_782_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_782_1"><button class="btn btn-outline-success"><span class="job_id">782 : Job ID 710b5f9ece1641e295a100f4602fe577</span></button></div></a><div aria-labelledby="job_list___sub_heading_782_1" data-parent="#job_list___sub_accordion_782" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_782_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=583" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (583, 49), end pos: (583, 50)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 98</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -580,7 +580,7 @@ app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is None or document_id &lt;= 1 or document_id &gt; MAX_DB_INT: return jsonify({"error": "document id required"}), 400 try:</pre></div><div class="alert alert-secondary"><pre class="diff">.......F...... [100%] ================================== FAILURES =================================== ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_get_document_route - assert False 1 failed, 13 passed, 22 warnings in 20.36s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_783"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_783_1" aria-expanded="false" aria-controls="job_list___sub_collapse_783_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_783_1"><button class="btn btn-outline-success"><span class="job_id">783 : Job ID a8956015967c45d7a08ccd403249d9d2</span></button></div></a><div aria-labelledby="job_list___sub_heading_783_1" data-parent="#job_list___sub_accordion_783" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_783_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=583" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (583, 49), end pos: (583, 50)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 99</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -580,7 +580,7 @@ app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 - if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: + if document_id is None or document_id &lt;= -1 or document_id &gt; MAX_DB_INT: return jsonify({"error": "document id required"}), 400 try:</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%]</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_784"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_784_1" aria-expanded="false" aria-controls="job_list___sub_collapse_784_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_784_1"><button class="btn btn-outline-danger"><span class="job_id">784 : Job ID b04b75460305405cb5fd3760deaad1db</span></button></div></a><div aria-labelledby="job_list___sub_heading_784_1" data-parent="#job_list___sub_accordion_784" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_784_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=584" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (584, 63), end pos: (584, 66)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 100</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -581,7 +581,7 @@ return jsonify({"error": "document id required"}), 400 if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: - return jsonify({"error": "document id required"}), 400 + return jsonify({"error": "document id required"}), 401 try: with get_engine().connect() as conn:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.14s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_785"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_785_1" aria-expanded="false" aria-controls="job_list___sub_collapse_785_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_785_1"><button class="btn btn-outline-danger"><span class="job_id">785 : Job ID 607d3fff951442c1bafd131750c08f6b</span></button></div></a><div aria-labelledby="job_list___sub_heading_785_1" data-parent="#job_list___sub_accordion_785" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_785_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=584" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (584, 63), end pos: (584, 66)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 101</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -581,7 +581,7 @@ return jsonify({"error": "document id required"}), 400 if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: - return jsonify({"error": "document id required"}), 400 + return jsonify({"error": "document id required"}), 399 try: with get_engine().connect() as conn:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.88s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_786"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_786_1" aria-expanded="false" aria-controls="job_list___sub_collapse_786_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_786_1"><button class="btn btn-outline-success"><span class="job_id">786 : Job ID d9bff3b38da64f2ca834348f0d71e9be</span></button></div></a><div aria-labelledby="job_list___sub_heading_786_1" data-parent="#job_list___sub_accordion_786" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_786_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=606" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (606, 15), end pos: (606, 18)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 102</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -603,7 +603,7 @@ inc_db_error("get_document") return jsonify( {"error": "An error occurred while fetching the document"} - ), 503 + ), 504 # Dont leak whether a doc exists for another user if not row:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T194124620050Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T194125602259Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.78s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_787"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_787_1" aria-expanded="false" aria-controls="job_list___sub_collapse_787_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_787_1"><button class="btn btn-outline-danger"><span class="job_id">787 : Job ID 5598be776b054a8cbba66aac37813fcd</span></button></div></a><div aria-labelledby="job_list___sub_heading_787_1" data-parent="#job_list___sub_accordion_787" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_787_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=606" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (606, 15), end pos: (606, 18)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 103</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -603,7 +603,7 @@ inc_db_error("get_document") return jsonify( {"error": "An error occurred while fetching the document"} - ), 503 + ), 502 # Dont leak whether a doc exists for another user if not row:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.93s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_788"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_788_1" aria-expanded="false" aria-controls="job_list___sub_collapse_788_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_788_1"><button class="btn btn-outline-success"><span class="job_id">788 : Job ID 1ed6f63447db4119815b83e160ee0fcd</span></button></div></a><div aria-labelledby="job_list___sub_heading_788_1" data-parent="#job_list___sub_accordion_788" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_788_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=613" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (613, 61), end pos: (613, 64)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 104</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -610,7 +610,7 @@ app.logger.warning( "Document not found or access denied for id=%s", document_id ) - return jsonify({"error": "document not found"}), 404 + return jsonify({"error": "document not found"}), 405 storage_root = app.config["STORAGE_DIR"].resolve() file_path = Path(row.path)</pre></div><div class="alert alert-secondary"><pre class="diff">...F...F.FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle assert is_pdf assert is_inline #Test with no parameters resp = client.get("/api/get-document") assert resp.status_code == 400 #Test with json parameters resp = client.get("/api/get-document", json = parameters) assert resp.status_code == 400 #Test with wrong parameters (missing file) resp = client.get("/api/get-document", query_string = {'documentid': 4}) &gt; assert resp.status_code == 404 E assert 405 == 404 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:293: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:580 Invalid document id in query WARNING server:server.py:580 Invalid document id in query WARNING server:server.py:610 Document not found or access denied for id=4 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e933464880bb593fb: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_get_document_route - assert 405 == 404 FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 6 failed, 8 passed, 22 warnings in 21.56s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_789"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_789_1" aria-expanded="false" aria-controls="job_list___sub_collapse_789_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_789_1"><button class="btn btn-outline-success"><span class="job_id">789 : Job ID bc00fd7dd5404ef29ce6096eccdefb07</span></button></div></a><div aria-labelledby="job_list___sub_heading_789_1" data-parent="#job_list___sub_accordion_789" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_789_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=613" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (613, 61), end pos: (613, 64)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 105</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -610,7 +610,7 @@ app.logger.warning( "Document not found or access denied for id=%s", document_id ) - return jsonify({"error": "document not found"}), 404 + return jsonify({"error": "document not found"}), 403 storage_root = app.config["STORAGE_DIR"].resolve() file_path = Path(row.path)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T161731484767Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T161732379744Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.27s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_790"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_790_1" aria-expanded="false" aria-controls="job_list___sub_collapse_790_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_790_1"><button class="btn btn-outline-danger"><span class="job_id">790 : Job ID 5d88c59e0c4449389946aaeaa85f98c0</span></button></div></a><div aria-labelledby="job_list___sub_heading_790_1" data-parent="#job_list___sub_accordion_790" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_790_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=627" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (627, 64), end pos: (627, 67)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 106</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -624,7 +624,7 @@ app.logger.warning( "Rejected document path for id %s: %s", document_id, row.path ) - return jsonify({"error": "document path invalid"}), 500 + return jsonify({"error": "document path invalid"}), 501 if not resolved.exists(): app.logger.error("File missing on disk for document id=%s", document_id)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 24.08s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_791"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_791_1" aria-expanded="false" aria-controls="job_list___sub_collapse_791_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_791_1"><button class="btn btn-outline-success"><span class="job_id">791 : Job ID 7ac6fc1819ee4b33806f85acad052205</span></button></div></a><div aria-labelledby="job_list___sub_heading_791_1" data-parent="#job_list___sub_accordion_791" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_791_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=627" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (627, 64), end pos: (627, 67)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 107</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -624,7 +624,7 @@ app.logger.warning( "Rejected document path for id %s: %s", document_id, row.path ) - return jsonify({"error": "document path invalid"}), 500 + return jsonify({"error": "document path invalid"}), 499 if not resolved.exists(): app.logger.error("File missing on disk for document id=%s", document_id)</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614eb19a67a954d73da5: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.62s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_792"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_792_1" aria-expanded="false" aria-controls="job_list___sub_collapse_792_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_792_1"><button class="btn btn-outline-danger"><span class="job_id">792 : Job ID 03bed908e33d418c96d76cb8ba8f7e0e</span></button></div></a><div aria-labelledby="job_list___sub_heading_792_1" data-parent="#job_list___sub_accordion_792" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_792_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=631" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (631, 63), end pos: (631, 66)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 108</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -628,7 +628,7 @@ if not resolved.exists(): app.logger.error("File missing on disk for document id=%s", document_id) - return jsonify({"error": "file missing on disk"}), 410 + return jsonify({"error": "file missing on disk"}), 411 # TOCTOU-safe open and validation try:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.29s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_793"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_793_1" aria-expanded="false" aria-controls="job_list___sub_collapse_793_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_793_1"><button class="btn btn-outline-danger"><span class="job_id">793 : Job ID 63d0f6b814ab474f95d43454b872ba97</span></button></div></a><div aria-labelledby="job_list___sub_heading_793_1" data-parent="#job_list___sub_accordion_793" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_793_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=631" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (631, 63), end pos: (631, 66)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 109</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -628,7 +628,7 @@ if not resolved.exists(): app.logger.error("File missing on disk for document id=%s", document_id) - return jsonify({"error": "file missing on disk"}), 410 + return jsonify({"error": "file missing on disk"}), 409 # TOCTOU-safe open and validation try:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.48s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_794"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_794_1" aria-expanded="false" aria-controls="job_list___sub_collapse_794_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_794_1"><button class="btn btn-outline-danger"><span class="job_id">794 : Job ID 1614dbfd3eea4e8ba699f80c87104117</span></button></div></a><div aria-labelledby="job_list___sub_heading_794_1" data-parent="#job_list___sub_accordion_794" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_794_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=638" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (638, 63), end pos: (638, 66)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 110</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -635,7 +635,7 @@ f = open(resolved, "rb") except OSError: app.logger.error("File missing on disk for document id=%s", document_id) - return jsonify({"error": "file missing on disk"}), 410 + return jsonify({"error": "file missing on disk"}), 411 try: # Quick PDF signature check</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.06s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_795"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_795_1" aria-expanded="false" aria-controls="job_list___sub_collapse_795_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_795_1"><button class="btn btn-outline-success"><span class="job_id">795 : Job ID 4fc8f40e8a5d49079e0591fd393ddbd6</span></button></div></a><div aria-labelledby="job_list___sub_heading_795_1" data-parent="#job_list___sub_accordion_795" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_795_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=638" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (638, 63), end pos: (638, 66)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 111</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -635,7 +635,7 @@ f = open(resolved, "rb") except OSError: app.logger.error("File missing on disk for document id=%s", document_id) - return jsonify({"error": "file missing on disk"}), 410 + return jsonify({"error": "file missing on disk"}), 409 try: # Quick PDF signature check</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e93e4c28298c531bf: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.84s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_796"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_796_1" aria-expanded="false" aria-controls="job_list___sub_collapse_796_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_796_1"><button class="btn btn-outline-success"><span class="job_id">796 : Job ID d837bddfd8724911affd1fa1d4ba55cd</span></button></div></a><div aria-labelledby="job_list___sub_heading_796_1" data-parent="#job_list___sub_accordion_796" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_796_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=642" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (642, 26), end pos: (642, 27)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 112</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -639,7 +639,7 @@ try: # Quick PDF signature check - head = f.read(5) + head = f.read( 6) if head != b"%PDF-": f.close() app.logger.warning(</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T142723582449Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T142724521547Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 20.21s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_797"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_797_1" aria-expanded="false" aria-controls="job_list___sub_collapse_797_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_797_1"><button class="btn btn-outline-success"><span class="job_id">797 : Job ID 60f759a93ca34dd998f89538d191c7e4</span></button></div></a><div aria-labelledby="job_list___sub_heading_797_1" data-parent="#job_list___sub_accordion_797" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_797_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=642" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (642, 26), end pos: (642, 27)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 113</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -639,7 +639,7 @@ try: # Quick PDF signature check - head = f.read(5) + head = f.read( 4) if head != b"%PDF-": f.close() app.logger.warning(</pre></div><div class="alert alert-secondary"><pre class="diff">.......F...... [100%] ================================== FAILURES =================================== ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:645 Invalid PDF signature for document id=1 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_get_document_route - assert False 1 failed, 13 passed, 22 warnings in 20.46s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_798"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_798_1" aria-expanded="false" aria-controls="job_list___sub_collapse_798_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_798_1"><button class="btn btn-outline-success"><span class="job_id">798 : Job ID d15c393ba9b541379166d9295e04c330</span></button></div></a><div aria-labelledby="job_list___sub_heading_798_1" data-parent="#job_list___sub_accordion_798" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_798_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=648" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (648, 69), end pos: (648, 72)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 114</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -645,7 +645,7 @@ app.logger.warning( "Invalid PDF signature for document id=%s", document_id ) - return jsonify({"error": "document not available"}), 415 + return jsonify({"error": "document not available"}), 416 f.seek(0) </pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e01b3ecb0b3a644f2: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.76s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_799"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_799_1" aria-expanded="false" aria-controls="job_list___sub_collapse_799_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_799_1"><button class="btn btn-outline-success"><span class="job_id">799 : Job ID 0150338369f14c69aeff00af6c88411c</span></button></div></a><div aria-labelledby="job_list___sub_heading_799_1" data-parent="#job_list___sub_accordion_799" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_799_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=648" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (648, 69), end pos: (648, 72)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 115</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -645,7 +645,7 @@ app.logger.warning( "Invalid PDF signature for document id=%s", document_id ) - return jsonify({"error": "document not available"}), 415 + return jsonify({"error": "document not available"}), 414 f.seek(0) </pre></div><div class="alert alert-secondary"><pre class="diff">...F.....F...F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614eb84a0dd57a18b6d4: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 3 failed, 11 passed, 22 warnings in 20.94s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_800"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_800_1" aria-expanded="false" aria-controls="job_list___sub_collapse_800_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_800_1"><button class="btn btn-outline-danger"><span class="job_id">800 : Job ID f8b21ea01ab24bc8b2bcf318196f816c</span></button></div></a><div aria-labelledby="job_list___sub_heading_800_1" data-parent="#job_list___sub_accordion_800" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_800_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=650" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (650, 19), end pos: (650, 20)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 116</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -647,7 +647,7 @@ ) return jsonify({"error": "document not available"}), 415 - f.seek(0) + f.seek( 1) # Prepare safe filename (preserve existing .pdf if present) name = (row.name or "document").strip().replace("\r", "").replace("\n", "")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.63s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_801"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_801_1" aria-expanded="false" aria-controls="job_list___sub_collapse_801_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_801_1"><button class="btn btn-outline-success"><span class="job_id">801 : Job ID 385d162239b3480a8441051714250ea7</span></button></div></a><div aria-labelledby="job_list___sub_heading_801_1" data-parent="#job_list___sub_accordion_801" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_801_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=650" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (650, 19), end pos: (650, 20)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 117</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -647,7 +647,7 @@ ) return jsonify({"error": "document not available"}), 415 - f.seek(0) + f.seek( -1) # Prepare safe filename (preserve existing .pdf if present) name = (row.name or "document").strip().replace("\r", "").replace("\n", "")</pre></div><div class="alert alert-secondary"><pre class="diff">.......F...... [100%] ================================== FAILURES =================================== ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:687 Error serving file for document id=1: [Errno 22] Invalid argument ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_get_document_route - assert False 1 failed, 13 passed, 22 warnings in 20.34s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_802"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_802_1" aria-expanded="false" aria-controls="job_list___sub_collapse_802_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_802_1"><button class="btn btn-outline-success"><span class="job_id">802 : Job ID b87e3e919dec4590af527dbba962be28</span></button></div></a><div aria-labelledby="job_list___sub_heading_802_1" data-parent="#job_list___sub_accordion_802" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_802_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=666" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (666, 24), end pos: (666, 25)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 118</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -663,7 +663,7 @@ as_attachment=False, download_name=name, conditional=False, # enables 304 if If-Modified-Since/Range handling - max_age=0, + max_age= 1, last_modified=st.st_mtime, ) </pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e834953a9d6b0dfed: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.68s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_803"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_803_1" aria-expanded="false" aria-controls="job_list___sub_collapse_803_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_803_1"><button class="btn btn-outline-success"><span class="job_id">803 : Job ID 6e7efc452a1a4a9b8d219720480836c8</span></button></div></a><div aria-labelledby="job_list___sub_heading_803_1" data-parent="#job_list___sub_accordion_803" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_803_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=666" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (666, 24), end pos: (666, 25)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 119</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -663,7 +663,7 @@ as_attachment=False, download_name=name, conditional=False, # enables 304 if If-Modified-Since/Range handling - max_age=0, + max_age= -1, last_modified=st.st_mtime, ) </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T231446919752Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T231447812515Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.30s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_804"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_804_1" aria-expanded="false" aria-controls="job_list___sub_collapse_804_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_804_1"><button class="btn btn-outline-danger"><span class="job_id">804 : Job ID 9639306e78e5481ca48b4d29e13e3e72</span></button></div></a><div aria-labelledby="job_list___sub_heading_804_1" data-parent="#job_list___sub_accordion_804" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_804_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=690" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (690, 61), end pos: (690, 64)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 120</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -687,7 +687,7 @@ app.logger.error( "Error serving file for document id=%s: %s", document_id, e ) - return jsonify({"error": "error serving file"}), 500 + return jsonify({"error": "error serving file"}), 501 # GET /api/get-version/&lt;link&gt;  returns the watermarked PDF (inline) @app.get("/api/get-version/&lt;link&gt;")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.25s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_805"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_805_1" aria-expanded="false" aria-controls="job_list___sub_collapse_805_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_805_1"><button class="btn btn-outline-danger"><span class="job_id">805 : Job ID 7d078bb1c3f24f1b848e1d106d5e1fc6</span></button></div></a><div aria-labelledby="job_list___sub_heading_805_1" data-parent="#job_list___sub_accordion_805" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_805_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=690" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (690, 61), end pos: (690, 64)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 121</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -687,7 +687,7 @@ app.logger.error( "Error serving file for document id=%s: %s", document_id, e ) - return jsonify({"error": "error serving file"}), 500 + return jsonify({"error": "error serving file"}), 499 # GET /api/get-version/&lt;link&gt;  returns the watermarked PDF (inline) @app.get("/api/get-version/&lt;link&gt;")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.88s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_806"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_806_1" aria-expanded="false" aria-controls="job_list___sub_collapse_806_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_806_1"><button class="btn btn-outline-danger"><span class="job_id">806 : Job ID 3a30468ba6cf4f99ace3443cd3e60a0b</span></button></div></a><div aria-labelledby="job_list___sub_heading_806_1" data-parent="#job_list___sub_accordion_806" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_806_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=698" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (698, 61), end pos: (698, 64)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 122</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -695,7 +695,7 @@ # Accept both 32-char (RMAP session secrets) and 64-char (SHA-256 style) tokens if not re.fullmatch(r"[0-9a-f]{32}|[0-9a-f]{64}", link): app.logger.warning("Invalid version link format: %s", link) - return jsonify({"error": "document not found"}), 404 + return jsonify({"error": "document not found"}), 405 try: with get_engine().connect() as conn:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.30s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_807"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_807_1" aria-expanded="false" aria-controls="job_list___sub_collapse_807_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_807_1"><button class="btn btn-outline-success"><span class="job_id">807 : Job ID e7dc60a11d9f41b095d545dcabb2dde9</span></button></div></a><div aria-labelledby="job_list___sub_heading_807_1" data-parent="#job_list___sub_accordion_807" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_807_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=698" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (698, 61), end pos: (698, 64)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 123</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -695,7 +695,7 @@ # Accept both 32-char (RMAP session secrets) and 64-char (SHA-256 style) tokens if not re.fullmatch(r"[0-9a-f]{32}|[0-9a-f]{64}", link): app.logger.warning("Invalid version link format: %s", link) - return jsonify({"error": "document not found"}), 404 + return jsonify({"error": "document not found"}), 403 try: with get_engine().connect() as conn:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T035209740633Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T035210647979Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.69s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_808"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_808_1" aria-expanded="false" aria-controls="job_list___sub_collapse_808_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_808_1"><button class="btn btn-outline-success"><span class="job_id">808 : Job ID 7cce0471d4bc45bea0f92e1f33d3a493</span></button></div></a><div aria-labelledby="job_list___sub_heading_808_1" data-parent="#job_list___sub_accordion_808" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_808_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=716" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (716, 57), end pos: (716, 60)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 124</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -713,7 +713,7 @@ except Exception as e: app.logger.error("Database error in get_version: %s", e) inc_db_error("get_version") - return jsonify({"error": "database error"}), 503 + return jsonify({"error": "database error"}), 504 if not row: app.logger.warning("Version not found for link: %s", link)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T234114984087Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T234115873661Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.25s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_809"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_809_1" aria-expanded="false" aria-controls="job_list___sub_collapse_809_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_809_1"><button class="btn btn-outline-danger"><span class="job_id">809 : Job ID 066455269cd24c48ad169213f576b6d7</span></button></div></a><div aria-labelledby="job_list___sub_heading_809_1" data-parent="#job_list___sub_accordion_809" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_809_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=716" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (716, 57), end pos: (716, 60)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 125</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -713,7 +713,7 @@ except Exception as e: app.logger.error("Database error in get_version: %s", e) inc_db_error("get_version") - return jsonify({"error": "database error"}), 503 + return jsonify({"error": "database error"}), 502 if not row: app.logger.warning("Version not found for link: %s", link)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.17s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_810"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_810_1" aria-expanded="false" aria-controls="job_list___sub_collapse_810_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_810_1"><button class="btn btn-outline-success"><span class="job_id">810 : Job ID 2e67349914e54bb89e400166b20e6bf9</span></button></div></a><div aria-labelledby="job_list___sub_heading_810_1" data-parent="#job_list___sub_accordion_810" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_810_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=720" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (720, 61), end pos: (720, 64)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 126</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -717,7 +717,7 @@ if not row: app.logger.warning("Version not found for link: %s", link) - return jsonify({"error": "document not found"}), 404 + return jsonify({"error": "document not found"}), 405 try: resolved = _safe_resolve_under_storage(row.path, app.config["STORAGE_DIR"])</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T203016219120Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T203017289544Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 20.00s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_811"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_811_1" aria-expanded="false" aria-controls="job_list___sub_collapse_811_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_811_1"><button class="btn btn-outline-danger"><span class="job_id">811 : Job ID 0c10afa5e0f747e8805b3e0a3bcc1f34</span></button></div></a><div aria-labelledby="job_list___sub_heading_811_1" data-parent="#job_list___sub_accordion_811" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_811_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=720" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (720, 61), end pos: (720, 64)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 127</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -717,7 +717,7 @@ if not row: app.logger.warning("Version not found for link: %s", link) - return jsonify({"error": "document not found"}), 404 + return jsonify({"error": "document not found"}), 403 try: resolved = _safe_resolve_under_storage(row.path, app.config["STORAGE_DIR"])</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.06s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_812"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_812_1" aria-expanded="false" aria-controls="job_list___sub_collapse_812_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_812_1"><button class="btn btn-outline-danger"><span class="job_id">812 : Job ID 8ce01efd04d64d5bb69db9834708289f</span></button></div></a><div aria-labelledby="job_list___sub_heading_812_1" data-parent="#job_list___sub_accordion_812" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_812_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=728" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (728, 64), end pos: (728, 67)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 128</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -725,7 +725,7 @@ app.logger.warning( "Rejected version path for link %s: %s (%s)", link, row.path, exc ) - return jsonify({"error": "document path invalid"}), 500 + return jsonify({"error": "document path invalid"}), 501 if not resolved.exists(): app.logger.error("File missing on disk for version link=%s", link)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.20s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_813"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_813_1" aria-expanded="false" aria-controls="job_list___sub_collapse_813_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_813_1"><button class="btn btn-outline-success"><span class="job_id">813 : Job ID 8eb928771d314c4787d22eccf46c94f2</span></button></div></a><div aria-labelledby="job_list___sub_heading_813_1" data-parent="#job_list___sub_accordion_813" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_813_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=728" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (728, 64), end pos: (728, 67)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 129</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -725,7 +725,7 @@ app.logger.warning( "Rejected version path for link %s: %s (%s)", link, row.path, exc ) - return jsonify({"error": "document path invalid"}), 500 + return jsonify({"error": "document path invalid"}), 499 if not resolved.exists(): app.logger.error("File missing on disk for version link=%s", link)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T052237987027Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T052238904531Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.61s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_814"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_814_1" aria-expanded="false" aria-controls="job_list___sub_collapse_814_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_814_1"><button class="btn btn-outline-danger"><span class="job_id">814 : Job ID e63c8e00e5964e2cb33072fe7b58f170</span></button></div></a><div aria-labelledby="job_list___sub_heading_814_1" data-parent="#job_list___sub_accordion_814" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_814_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=732" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (732, 63), end pos: (732, 66)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 130</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -729,7 +729,7 @@ if not resolved.exists(): app.logger.error("File missing on disk for version link=%s", link) - return jsonify({"error": "file missing on disk"}), 410 + return jsonify({"error": "file missing on disk"}), 411 try: with resolved.open("rb") as fh:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.95s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_815"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_815_1" aria-expanded="false" aria-controls="job_list___sub_collapse_815_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_815_1"><button class="btn btn-outline-danger"><span class="job_id">815 : Job ID 1c9f67b21b69404c99cae7088f750681</span></button></div></a><div aria-labelledby="job_list___sub_heading_815_1" data-parent="#job_list___sub_accordion_815" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_815_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=732" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (732, 63), end pos: (732, 66)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 131</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -729,7 +729,7 @@ if not resolved.exists(): app.logger.error("File missing on disk for version link=%s", link) - return jsonify({"error": "file missing on disk"}), 410 + return jsonify({"error": "file missing on disk"}), 409 try: with resolved.open("rb") as fh:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.29s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_816"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_816_1" aria-expanded="false" aria-controls="job_list___sub_collapse_816_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_816_1"><button class="btn btn-outline-danger"><span class="job_id">816 : Job ID 4cec7dfcd236449380749c22a037d603</span></button></div></a><div aria-labelledby="job_list___sub_heading_816_1" data-parent="#job_list___sub_accordion_816" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_816_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=736" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (736, 33), end pos: (736, 34)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 132</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -733,7 +733,7 @@ try: with resolved.open("rb") as fh: - header = fh.read(5) + header = fh.read( 6) if header != b"%PDF-": app.logger.warning( "Invalid PDF signature for version link=%s", link</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.36s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_817"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_817_1" aria-expanded="false" aria-controls="job_list___sub_collapse_817_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_817_1"><button class="btn btn-outline-success"><span class="job_id">817 : Job ID c3341cadfcc740bca952b599b6a5b658</span></button></div></a><div aria-labelledby="job_list___sub_heading_817_1" data-parent="#job_list___sub_accordion_817" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_817_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=736" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (736, 33), end pos: (736, 34)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 133</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -733,7 +733,7 @@ try: with resolved.open("rb") as fh: - header = fh.read(5) + header = fh.read( 4) if header != b"%PDF-": app.logger.warning( "Invalid PDF signature for version link=%s", link</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ef5dde073ec300fba: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.65s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_818"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_818_1" aria-expanded="false" aria-controls="job_list___sub_collapse_818_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_818_1"><button class="btn btn-outline-danger"><span class="job_id">818 : Job ID d9bb61e0ee3549f3971525b32ad46d3c</span></button></div></a><div aria-labelledby="job_list___sub_heading_818_1" data-parent="#job_list___sub_accordion_818" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_818_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=741" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (741, 73), end pos: (741, 76)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 134</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -738,7 +738,7 @@ app.logger.warning( "Invalid PDF signature for version link=%s", link ) - return jsonify({"error": "document not available"}), 415 + return jsonify({"error": "document not available"}), 416 fh.seek(0) last_modified = os.fstat(fh.fileno()).st_mtime except OSError:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.77s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_819"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_819_1" aria-expanded="false" aria-controls="job_list___sub_collapse_819_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_819_1"><button class="btn btn-outline-danger"><span class="job_id">819 : Job ID 5c708249fd6e46a6be0f4e827273ab0f</span></button></div></a><div aria-labelledby="job_list___sub_heading_819_1" data-parent="#job_list___sub_accordion_819" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_819_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=741" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (741, 73), end pos: (741, 76)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 135</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -738,7 +738,7 @@ app.logger.warning( "Invalid PDF signature for version link=%s", link ) - return jsonify({"error": "document not available"}), 415 + return jsonify({"error": "document not available"}), 414 fh.seek(0) last_modified = os.fstat(fh.fileno()).st_mtime except OSError:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.24s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_820"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_820_1" aria-expanded="false" aria-controls="job_list___sub_collapse_820_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_820_1"><button class="btn btn-outline-danger"><span class="job_id">820 : Job ID 7d902102e547410e9b82adfd89bc3078</span></button></div></a><div aria-labelledby="job_list___sub_heading_820_1" data-parent="#job_list___sub_accordion_820" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_820_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=742" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (742, 24), end pos: (742, 25)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 136</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -739,7 +739,7 @@ "Invalid PDF signature for version link=%s", link ) return jsonify({"error": "document not available"}), 415 - fh.seek(0) + fh.seek( 1) last_modified = os.fstat(fh.fileno()).st_mtime except OSError: app.logger.error("File missing on disk for version link=%s", link)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.33s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_821"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_821_1" aria-expanded="false" aria-controls="job_list___sub_collapse_821_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_821_1"><button class="btn btn-outline-danger"><span class="job_id">821 : Job ID de2812ffdfda4617a77fd04b8977d0f9</span></button></div></a><div aria-labelledby="job_list___sub_heading_821_1" data-parent="#job_list___sub_accordion_821" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_821_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=742" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (742, 24), end pos: (742, 25)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 137</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -739,7 +739,7 @@ "Invalid PDF signature for version link=%s", link ) return jsonify({"error": "document not available"}), 415 - fh.seek(0) + fh.seek( -1) last_modified = os.fstat(fh.fileno()).st_mtime except OSError: app.logger.error("File missing on disk for version link=%s", link)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.66s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_822"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_822_1" aria-expanded="false" aria-controls="job_list___sub_collapse_822_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_822_1"><button class="btn btn-outline-danger"><span class="job_id">822 : Job ID 1b403495b98448f28faa1f193506ac91</span></button></div></a><div aria-labelledby="job_list___sub_heading_822_1" data-parent="#job_list___sub_accordion_822" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_822_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=746" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (746, 63), end pos: (746, 66)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 138</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -743,7 +743,7 @@ last_modified = os.fstat(fh.fileno()).st_mtime except OSError: app.logger.error("File missing on disk for version link=%s", link) - return jsonify({"error": "file missing on disk"}), 410 + return jsonify({"error": "file missing on disk"}), 411 except Exception as e: app.logger.error("Error inspecting version file for %s: %s", link, e) return jsonify({"error": "error serving file"}), 500</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.40s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_823"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_823_1" aria-expanded="false" aria-controls="job_list___sub_collapse_823_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_823_1"><button class="btn btn-outline-success"><span class="job_id">823 : Job ID d4391ed8dcbf4cf991db25cb49e12637</span></button></div></a><div aria-labelledby="job_list___sub_heading_823_1" data-parent="#job_list___sub_accordion_823" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_823_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=746" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (746, 63), end pos: (746, 66)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 139</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -743,7 +743,7 @@ last_modified = os.fstat(fh.fileno()).st_mtime except OSError: app.logger.error("File missing on disk for version link=%s", link) - return jsonify({"error": "file missing on disk"}), 410 + return jsonify({"error": "file missing on disk"}), 409 except Exception as e: app.logger.error("Error inspecting version file for %s: %s", link, e) return jsonify({"error": "error serving file"}), 500</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T002932843237Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T002933819517Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.32s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_824"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_824_1" aria-expanded="false" aria-controls="job_list___sub_collapse_824_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_824_1"><button class="btn btn-outline-success"><span class="job_id">824 : Job ID ece75c1b95394ddfa9afb47239eec57c</span></button></div></a><div aria-labelledby="job_list___sub_heading_824_1" data-parent="#job_list___sub_accordion_824" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_824_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=749" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (749, 61), end pos: (749, 64)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 140</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -746,7 +746,7 @@ return jsonify({"error": "file missing on disk"}), 410 except Exception as e: app.logger.error("Error inspecting version file for %s: %s", link, e) - return jsonify({"error": "error serving file"}), 500 + return jsonify({"error": "error serving file"}), 501 download_name = ( row.link if row.link.lower().endswith(".pdf") else f"{row.link}.pdf"</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T142951030580Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T142952012817Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 20.41s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_825"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_825_1" aria-expanded="false" aria-controls="job_list___sub_collapse_825_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_825_1"><button class="btn btn-outline-success"><span class="job_id">825 : Job ID f4cb3dacd24442c9a2d9f4bceffe4f3a</span></button></div></a><div aria-labelledby="job_list___sub_heading_825_1" data-parent="#job_list___sub_accordion_825" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_825_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=749" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (749, 61), end pos: (749, 64)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 141</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -746,7 +746,7 @@ return jsonify({"error": "file missing on disk"}), 410 except Exception as e: app.logger.error("Error inspecting version file for %s: %s", link, e) - return jsonify({"error": "error serving file"}), 500 + return jsonify({"error": "error serving file"}), 499 download_name = ( row.link if row.link.lower().endswith(".pdf") else f"{row.link}.pdf"</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T014704300238Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T014705162601Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.28s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_826"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_826_1" aria-expanded="false" aria-controls="job_list___sub_collapse_826_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_826_1"><button class="btn btn-outline-danger"><span class="job_id">826 : Job ID 3695abf473424e7089b566bee3327778</span></button></div></a><div aria-labelledby="job_list___sub_heading_826_1" data-parent="#job_list___sub_accordion_826" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_826_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=763" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (763, 24), end pos: (763, 25)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 142</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -760,7 +760,7 @@ as_attachment=False, download_name=safe_download, conditional=True, - max_age=0, + max_age= 1, last_modified=last_modified, ) except Exception as e:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.15s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_827"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_827_1" aria-expanded="false" aria-controls="job_list___sub_collapse_827_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_827_1"><button class="btn btn-outline-danger"><span class="job_id">827 : Job ID 01b6a31f9ed3479e9058e29bce49f249</span></button></div></a><div aria-labelledby="job_list___sub_heading_827_1" data-parent="#job_list___sub_accordion_827" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_827_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=763" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (763, 24), end pos: (763, 25)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 143</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -760,7 +760,7 @@ as_attachment=False, download_name=safe_download, conditional=True, - max_age=0, + max_age= -1, last_modified=last_modified, ) except Exception as e:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.39s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_828"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_828_1" aria-expanded="false" aria-controls="job_list___sub_collapse_828_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_828_1"><button class="btn btn-outline-danger"><span class="job_id">828 : Job ID 25ed67d92c7f4ed2b61bccfb5ba4143f</span></button></div></a><div aria-labelledby="job_list___sub_heading_828_1" data-parent="#job_list___sub_accordion_828" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_828_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=768" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (768, 61), end pos: (768, 64)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 144</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -765,7 +765,7 @@ ) except Exception as e: app.logger.error("Error serving version %s: %s", link, e) - return jsonify({"error": "error serving file"}), 500 + return jsonify({"error": "error serving file"}), 501 resp.headers["Cache-Control"] = "private, max-age=0, must-revalidate" resp.headers["Content-Type"] = "application/pdf"</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.27s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_829"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_829_1" aria-expanded="false" aria-controls="job_list___sub_collapse_829_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_829_1"><button class="btn btn-outline-success"><span class="job_id">829 : Job ID 62c341d42699463a897c4ce67af9d567</span></button></div></a><div aria-labelledby="job_list___sub_heading_829_1" data-parent="#job_list___sub_accordion_829" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_829_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=768" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (768, 61), end pos: (768, 64)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 145</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -765,7 +765,7 @@ ) except Exception as e: app.logger.error("Error serving version %s: %s", link, e) - return jsonify({"error": "error serving file"}), 500 + return jsonify({"error": "error serving file"}), 499 resp.headers["Cache-Control"] = "private, max-age=0, must-revalidate" resp.headers["Content-Type"] = "application/pdf"</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T161955962336Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T161956856578Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.42s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_830"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_830_1" aria-expanded="false" aria-controls="job_list___sub_collapse_830_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_830_1"><button class="btn btn-outline-danger"><span class="job_id">830 : Job ID 18ccaf2f85454b2ab6a4f02d47f1dd29</span></button></div></a><div aria-labelledby="job_list___sub_heading_830_1" data-parent="#job_list___sub_accordion_830" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_830_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=815" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (815, 63), end pos: (815, 66)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 146</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -812,7 +812,7 @@ if document_id is None: app.logger.warning("Document id required for deletion") - return jsonify({"error": "document id required"}), 400 + return jsonify({"error": "document id required"}), 401 try: doc_id = int(document_id)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.47s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_831"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_831_1" aria-expanded="false" aria-controls="job_list___sub_collapse_831_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_831_1"><button class="btn btn-outline-danger"><span class="job_id">831 : Job ID e5d51b2a39554d009049bb3fc1089d4c</span></button></div></a><div aria-labelledby="job_list___sub_heading_831_1" data-parent="#job_list___sub_accordion_831" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_831_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=815" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (815, 63), end pos: (815, 66)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 147</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -812,7 +812,7 @@ if document_id is None: app.logger.warning("Document id required for deletion") - return jsonify({"error": "document id required"}), 400 + return jsonify({"error": "document id required"}), 399 try: doc_id = int(document_id)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.89s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_832"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_832_1" aria-expanded="false" aria-controls="job_list___sub_collapse_832_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_832_1"><button class="btn btn-outline-danger"><span class="job_id">832 : Job ID 0a32224e890340e4b1fd60c954588220</span></button></div></a><div aria-labelledby="job_list___sub_heading_832_1" data-parent="#job_list___sub_accordion_832" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_832_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=821" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (821, 63), end pos: (821, 66)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 148</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -818,7 +818,7 @@ doc_id = int(document_id) except (TypeError, ValueError): app.logger.warning("Invalid document id for deletion: %s", document_id) - return jsonify({"error": "document id required"}), 400 + return jsonify({"error": "document id required"}), 401 if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: app.logger.warning("Non-positive document id for deletion: %s", doc_id)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.47s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_833"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_833_1" aria-expanded="false" aria-controls="job_list___sub_collapse_833_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_833_1"><button class="btn btn-outline-success"><span class="job_id">833 : Job ID 77fb14e502b34b5aac0cc862b52d0d8f</span></button></div></a><div aria-labelledby="job_list___sub_heading_833_1" data-parent="#job_list___sub_accordion_833" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_833_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=821" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (821, 63), end pos: (821, 66)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 149</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -818,7 +818,7 @@ doc_id = int(document_id) except (TypeError, ValueError): app.logger.warning("Invalid document id for deletion: %s", document_id) - return jsonify({"error": "document id required"}), 400 + return jsonify({"error": "document id required"}), 399 if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: app.logger.warning("Non-positive document id for deletion: %s", doc_id)</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ef5b4fdf2f9352cdc: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.79s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_834"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_834_1" aria-expanded="false" aria-controls="job_list___sub_collapse_834_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_834_1"><button class="btn btn-outline-success"><span class="job_id">834 : Job ID 159c504cc4f647b09d5f5bf078c3ce95</span></button></div></a><div aria-labelledby="job_list___sub_heading_834_1" data-parent="#job_list___sub_accordion_834" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_834_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=823" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (823, 21), end pos: (823, 22)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 150</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -820,7 +820,7 @@ app.logger.warning("Invalid document id for deletion: %s", document_id) return jsonify({"error": "document id required"}), 400 - if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: + if doc_id &lt;= 1 or doc_id &gt; MAX_DB_INT: app.logger.warning("Non-positive document id for deletion: %s", doc_id) return jsonify({"error": "document id required"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%]</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_835"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_835_1" aria-expanded="false" aria-controls="job_list___sub_collapse_835_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_835_1"><button class="btn btn-outline-success"><span class="job_id">835 : Job ID 3c01c9e99eb542b6995d518a9b6d23ad</span></button></div></a><div aria-labelledby="job_list___sub_heading_835_1" data-parent="#job_list___sub_accordion_835" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_835_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=823" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (823, 21), end pos: (823, 22)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 151</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -820,7 +820,7 @@ app.logger.warning("Invalid document id for deletion: %s", document_id) return jsonify({"error": "document id required"}), 400 - if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: + if doc_id &lt;= -1 or doc_id &gt; MAX_DB_INT: app.logger.warning("Non-positive document id for deletion: %s", doc_id) return jsonify({"error": "document id required"}), 400 </pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e7d4f5d2542eaa7bf: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.80s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_836"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_836_1" aria-expanded="false" aria-controls="job_list___sub_collapse_836_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_836_1"><button class="btn btn-outline-danger"><span class="job_id">836 : Job ID 271a0543e2ff41a3ab536dd0181b3f53</span></button></div></a><div aria-labelledby="job_list___sub_heading_836_1" data-parent="#job_list___sub_accordion_836" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_836_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=825" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (825, 63), end pos: (825, 66)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 152</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -822,7 +822,7 @@ if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: app.logger.warning("Non-positive document id for deletion: %s", doc_id) - return jsonify({"error": "document id required"}), 400 + return jsonify({"error": "document id required"}), 401 owner_id = int(g.user["id"]) </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.30s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_837"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_837_1" aria-expanded="false" aria-controls="job_list___sub_collapse_837_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_837_1"><button class="btn btn-outline-success"><span class="job_id">837 : Job ID 6ec187afd22e4df18edb1cd303387874</span></button></div></a><div aria-labelledby="job_list___sub_heading_837_1" data-parent="#job_list___sub_accordion_837" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_837_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=825" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (825, 63), end pos: (825, 66)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 153</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -822,7 +822,7 @@ if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: app.logger.warning("Non-positive document id for deletion: %s", doc_id) - return jsonify({"error": "document id required"}), 400 + return jsonify({"error": "document id required"}), 399 owner_id = int(g.user["id"]) </pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e32da4c31f0d53f46: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.80s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_838"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_838_1" aria-expanded="false" aria-controls="job_list___sub_collapse_838_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_838_1"><button class="btn btn-outline-danger"><span class="job_id">838 : Job ID bdb21a91095b4290a08aa8e0957c3821</span></button></div></a><div aria-labelledby="job_list___sub_heading_838_1" data-parent="#job_list___sub_accordion_838" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_838_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=846" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (846, 71), end pos: (846, 74)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 154</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -843,7 +843,7 @@ except Exception as e: app.logger.error("DB delete error for doc id=%s: %s", doc_id, e) inc_db_error("delete_document_select") - return jsonify({"error": "database error during delete"}), 503 + return jsonify({"error": "database error during delete"}), 504 if not row: # Dont reveal others docsjust say not found</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.29s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_839"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_839_1" aria-expanded="false" aria-controls="job_list___sub_collapse_839_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_839_1"><button class="btn btn-outline-success"><span class="job_id">839 : Job ID 80cdb19d2573456a988050e482562fd6</span></button></div></a><div aria-labelledby="job_list___sub_heading_839_1" data-parent="#job_list___sub_accordion_839" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_839_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=846" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (846, 71), end pos: (846, 74)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 155</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -843,7 +843,7 @@ except Exception as e: app.logger.error("DB delete error for doc id=%s: %s", doc_id, e) inc_db_error("delete_document_select") - return jsonify({"error": "database error during delete"}), 503 + return jsonify({"error": "database error during delete"}), 502 if not row: # Dont reveal others docsjust say not found</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e5164343dd78f126d: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 21.56s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_840"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_840_1" aria-expanded="false" aria-controls="job_list___sub_collapse_840_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_840_1"><button class="btn btn-outline-success"><span class="job_id">840 : Job ID ca75091188f34a68ab6c543eb4076034</span></button></div></a><div aria-labelledby="job_list___sub_heading_840_1" data-parent="#job_list___sub_accordion_840" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_840_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=853" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (853, 61), end pos: (853, 64)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 156</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -850,7 +850,7 @@ app.logger.warning( "Document not found or access denied for deletion id=%s", doc_id ) - return jsonify({"error": "document not found"}), 404 + return jsonify({"error": "document not found"}), 405 # Resolve and delete file (best effort) storage_root = Path(app.config["STORAGE_DIR"])</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T201030487747Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T201031392707Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.69s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_841"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_841_1" aria-expanded="false" aria-controls="job_list___sub_collapse_841_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_841_1"><button class="btn btn-outline-success"><span class="job_id">841 : Job ID b97485756f234c82b218fb9ee66c676d</span></button></div></a><div aria-labelledby="job_list___sub_heading_841_1" data-parent="#job_list___sub_accordion_841" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_841_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=853" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (853, 61), end pos: (853, 64)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 157</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -850,7 +850,7 @@ app.logger.warning( "Document not found or access denied for deletion id=%s", doc_id ) - return jsonify({"error": "document not found"}), 404 + return jsonify({"error": "document not found"}), 403 # Resolve and delete file (best effort) storage_root = Path(app.config["STORAGE_DIR"])</pre></div><div class="alert alert-secondary"><pre class="diff">...F.......... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:228: in open request = self._request_from_builder_args(args, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:200: in _request_from_builder_args return builder.get_request() ^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:764: in get_request return cls(self.get_environ()) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:688: in get_environ input_stream, content_length, boundary = stream_encode_multipart( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:130: in stream_encode_multipart write_binary(encoder.send_event(Data(data=chunk, more_data=True))) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:81: in write_binary return stream.write(s) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... 1 failed, 13 passed, 22 warnings in 19.91s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_842"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_842_1" aria-expanded="false" aria-controls="job_list___sub_collapse_842_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_842_1"><button class="btn btn-outline-danger"><span class="job_id">842 : Job ID 58c063c7490d474589ad32745eb4147b</span></button></div></a><div aria-labelledby="job_list___sub_heading_842_1" data-parent="#job_list___sub_accordion_842" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_842_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=892" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (892, 71), end pos: (892, 74)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 158</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -889,7 +889,7 @@ except Exception as e: app.logger.error("DB delete error for doc id=%s: %s", doc_id, e) inc_db_error("delete_document_delete") - return jsonify({"error": "database error during delete"}), 503 + return jsonify({"error": "database error during delete"}), 504 return jsonify( {</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.23s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_843"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_843_1" aria-expanded="false" aria-controls="job_list___sub_collapse_843_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_843_1"><button class="btn btn-outline-success"><span class="job_id">843 : Job ID 3b35e386aca44fd7bf2d97f47b073e70</span></button></div></a><div aria-labelledby="job_list___sub_heading_843_1" data-parent="#job_list___sub_accordion_843" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_843_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=892" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (892, 71), end pos: (892, 74)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 159</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -889,7 +889,7 @@ except Exception as e: app.logger.error("DB delete error for doc id=%s: %s", doc_id, e) inc_db_error("delete_document_delete") - return jsonify({"error": "database error during delete"}), 503 + return jsonify({"error": "database error during delete"}), 502 return jsonify( {</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ecaee91f0abfa537a: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.84s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_844"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_844_1" aria-expanded="false" aria-controls="job_list___sub_collapse_844_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_844_1"><button class="btn btn-outline-success"><span class="job_id">844 : Job ID 47fe2d477d2a4241b2e3ffafb6eadf4e</span></button></div></a><div aria-labelledby="job_list___sub_heading_844_1" data-parent="#job_list___sub_accordion_844" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_844_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=902" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (902, 11), end pos: (902, 14)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 160</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -899,7 +899,7 @@ "file_missing": file_missing, "note": delete_error, # null/omitted if everything was fine } - ), 200 + ), 201 # POST /api/create-watermark or /api/create-watermark/&lt;id&gt; #  create watermarked pdf and returns metadata</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T202439113589Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T202440180729Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 20.89s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_845"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_845_1" aria-expanded="false" aria-controls="job_list___sub_collapse_845_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_845_1"><button class="btn btn-outline-success"><span class="job_id">845 : Job ID ae6d0357bfce4335bc1ef8d81bf6591e</span></button></div></a><div aria-labelledby="job_list___sub_heading_845_1" data-parent="#job_list___sub_accordion_845" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_845_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=902" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (902, 11), end pos: (902, 14)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 161</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -899,7 +899,7 @@ "file_missing": file_missing, "note": delete_error, # null/omitted if everything was fine } - ), 200 + ), 199 # POST /api/create-watermark or /api/create-watermark/&lt;id&gt; #  create watermarked pdf and returns metadata</pre></div><div class="alert alert-secondary"><pre class="diff">...........F.. [100%] ================================== FAILURES =================================== _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 199 == 200 E + where 199 = &lt;WrapperTestResponse streamed [199 UNKNOWN]&gt;.status_code ..\test\test_api.py:443: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_delete_document_route - assert 199 == 200 1 failed, 13 passed, 22 warnings in 21.68s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_846"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_846_1" aria-expanded="false" aria-controls="job_list___sub_collapse_846_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_846_1"><button class="btn btn-outline-danger"><span class="job_id">846 : Job ID 87f13828f2f64ad286a8ebf1ee680508</span></button></div></a><div aria-labelledby="job_list___sub_heading_846_1" data-parent="#job_list___sub_accordion_846" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_846_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=921" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (921, 63), end pos: (921, 66)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 162</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -918,7 +918,7 @@ doc_id = document_id except (TypeError, ValueError): app.logger.warning("Invalid document id in query: %s", document_id) - return jsonify({"error": "document id required"}), 400 + return jsonify({"error": "document id required"}), 401 payload = request.get_json(silent=True) or {} # allow a couple of aliases for convenience</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.12s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_847"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_847_1" aria-expanded="false" aria-controls="job_list___sub_collapse_847_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_847_1"><button class="btn btn-outline-danger"><span class="job_id">847 : Job ID 36d387143b1547b9b87b6bad49f9eb37</span></button></div></a><div aria-labelledby="job_list___sub_heading_847_1" data-parent="#job_list___sub_accordion_847" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_847_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=921" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (921, 63), end pos: (921, 66)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 163</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -918,7 +918,7 @@ doc_id = document_id except (TypeError, ValueError): app.logger.warning("Invalid document id in query: %s", document_id) - return jsonify({"error": "document id required"}), 400 + return jsonify({"error": "document id required"}), 399 payload = request.get_json(silent=True) or {} # allow a couple of aliases for convenience</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.00s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_848"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_848_1" aria-expanded="false" aria-controls="job_list___sub_collapse_848_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_848_1"><button class="btn btn-outline-success"><span class="job_id">848 : Job ID ac297923edbe4d21861dfde3641da8bc</span></button></div></a><div aria-labelledby="job_list___sub_heading_848_1" data-parent="#job_list___sub_accordion_848" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_848_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=935" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (935, 76), end pos: (935, 79)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 164</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -932,7 +932,7 @@ try: if doc_id is None: app.logger.warning("Missing document id in request") - return jsonify({"error": "document_id (int) is required"}), 400 + return jsonify({"error": "document_id (int) is required"}), 401 doc_id = int(doc_id) if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T043829918301Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T043830829121Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.74s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_849"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_849_1" aria-expanded="false" aria-controls="job_list___sub_collapse_849_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_849_1"><button class="btn btn-outline-success"><span class="job_id">849 : Job ID 16489cee81ec4b0187aa68bef39b7eae</span></button></div></a><div aria-labelledby="job_list___sub_heading_849_1" data-parent="#job_list___sub_accordion_849" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_849_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=935" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (935, 76), end pos: (935, 79)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 165</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -932,7 +932,7 @@ try: if doc_id is None: app.logger.warning("Missing document id in request") - return jsonify({"error": "document_id (int) is required"}), 400 + return jsonify({"error": "document_id (int) is required"}), 399 doc_id = int(doc_id) if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("id"), int) assert isinstance(data.get("documentid"), int) assert isinstance(data.get("link"), str) assert isinstance(data.get("intended_for"), str) assert isinstance(data.get("method"), str) assert isinstance(data.get("position"), str) assert isinstance(data.get("filename"), str) assert isinstance(data.get("size"), int) #check values assert data.get("documentid") == parameters["id"] assert data.get("intended_for") == parameters["intended_for"] assert data.get("method") == parameters["method"] assert data.get("position") == parameters["position"] #Tests with wrong parameters #Test with exact same call: should return database insertion error (Non unique entry) resp = client.post("/api/create-watermark", json=parameters) assert resp.status_code == 503 #Non existant method resp = client.post("/api/create-watermark", json={"method": "watermarkmethod", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Non existant document resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 8}) assert resp.status_code == 404 #Missing id resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"}) &gt; assert resp.status_code == 400 E assert 399 == 400 E + where 399 = &lt;WrapperTestResponse streamed [399 UNKNOWN]&gt;.status_code ..\test\test_api.py:354: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1097 Integrity error during version insert for document 1: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b' for key 'uq_Versions_link'") [SQL: INSERT INTO Versions (documentid, link, intended_for, secret, method, position, path) VALUES (%(documentid)s, %(link)s, %(intended_for)s, %(secret)s, %(method)s, %(position)s, %(path)s) ] [parameters: {'documentid': 1, 'link': 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b', 'intended_for': 'Mickey Mouse', 'secret': 'secret', 'method': 'robust-xmp', 'position': 'metadata-only', 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username\\watermarks\\My File__Mickey_Mouse.pdf'}] (Background on this error at: https://sqlalche.me/e/20/gkpj) ERROR server:server.py:1007 Watermark applicability check failed for document 1: "Unknown watermarking method: 'watermarkmethod'. Known: ['overlay-watermark', 'robust-xmp', 'signed-annots']" WARNING server:server.py:972 Document not found or access denied for watermarking id=8 WARNING server:server.py:934 Missing document id in request ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 399 == 400 1 failed, 13 passed, 22 warnings in 20.47s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_850"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_850_1" aria-expanded="false" aria-controls="job_list___sub_collapse_850_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_850_1"><button class="btn btn-outline-success"><span class="job_id">850 : Job ID 723f06dd9cbf41b38a5dd7b7450d4c30</span></button></div></a><div aria-labelledby="job_list___sub_heading_850_1" data-parent="#job_list___sub_accordion_850" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_850_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=937" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (937, 25), end pos: (937, 26)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 166</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -934,7 +934,7 @@ app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) - if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: + if doc_id &lt;= 1 or doc_id &gt; MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T175131746264Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 42 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T175132647029Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.31s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_851"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_851_1" aria-expanded="false" aria-controls="job_list___sub_collapse_851_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_851_1"><button class="btn btn-outline-danger"><span class="job_id">851 : Job ID cfd1839d5ed54ccfac24851c91e815c3</span></button></div></a><div aria-labelledby="job_list___sub_heading_851_1" data-parent="#job_list___sub_accordion_851" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_851_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=937" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (937, 25), end pos: (937, 26)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 167</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -934,7 +934,7 @@ app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) - if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: + if doc_id &lt;= -1 or doc_id &gt; MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.38s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_852"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_852_1" aria-expanded="false" aria-controls="job_list___sub_collapse_852_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_852_1"><button class="btn btn-outline-danger"><span class="job_id">852 : Job ID 55ea05df58284896aa0c22d4c4425cab</span></button></div></a><div aria-labelledby="job_list___sub_heading_852_1" data-parent="#job_list___sub_accordion_852" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_852_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=938" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (938, 76), end pos: (938, 79)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 168</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -935,7 +935,7 @@ return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: - return jsonify({"error": "document_id (int) is required"}), 400 + return jsonify({"error": "document_id (int) is required"}), 401 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id) return jsonify({"error": "document_id (int) is required"}), 400</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.16s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_853"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_853_1" aria-expanded="false" aria-controls="job_list___sub_collapse_853_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_853_1"><button class="btn btn-outline-danger"><span class="job_id">853 : Job ID 98df302a40a74c1d9a2afc61a56c110c</span></button></div></a><div aria-labelledby="job_list___sub_heading_853_1" data-parent="#job_list___sub_accordion_853" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_853_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=938" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (938, 76), end pos: (938, 79)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 169</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -935,7 +935,7 @@ return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: - return jsonify({"error": "document_id (int) is required"}), 400 + return jsonify({"error": "document_id (int) is required"}), 399 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id) return jsonify({"error": "document_id (int) is required"}), 400</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.79s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_854"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_854_1" aria-expanded="false" aria-controls="job_list___sub_collapse_854_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_854_1"><button class="btn btn-outline-danger"><span class="job_id">854 : Job ID 0b482009642e45fea46df7c849a8160b</span></button></div></a><div aria-labelledby="job_list___sub_heading_854_1" data-parent="#job_list___sub_accordion_854" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_854_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=941" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (941, 72), end pos: (941, 75)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 170</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -938,7 +938,7 @@ return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id) - return jsonify({"error": "document_id (int) is required"}), 400 + return jsonify({"error": "document_id (int) is required"}), 401 if ( not method or not intended_for</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.05s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_855"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_855_1" aria-expanded="false" aria-controls="job_list___sub_collapse_855_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_855_1"><button class="btn btn-outline-danger"><span class="job_id">855 : Job ID cee2def75dd34ffba07cd0ce06d2fe10</span></button></div></a><div aria-labelledby="job_list___sub_heading_855_1" data-parent="#job_list___sub_accordion_855" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_855_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=941" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (941, 72), end pos: (941, 75)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 171</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -938,7 +938,7 @@ return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id) - return jsonify({"error": "document_id (int) is required"}), 400 + return jsonify({"error": "document_id (int) is required"}), 399 if ( not method or not intended_for</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.63s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_856"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_856_1" aria-expanded="false" aria-controls="job_list___sub_collapse_856_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_856_1"><button class="btn btn-outline-success"><span class="job_id">856 : Job ID 0bd34ed8cb9a46ac8c30d1ed62c9ed5e</span></button></div></a><div aria-labelledby="job_list___sub_heading_856_1" data-parent="#job_list___sub_accordion_856" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_856_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=951" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (951, 15), end pos: (951, 18)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 172</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -948,7 +948,7 @@ app.logger.warning("Missing required fields for watermarking: %s", payload) return jsonify( {"error": "method, intended_for, secret, and key are required"} - ), 400 + ), 401 # lookup the document; enforce ownership try:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T203202636036Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T203203522765Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.71s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_857"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_857_1" aria-expanded="false" aria-controls="job_list___sub_collapse_857_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_857_1"><button class="btn btn-outline-success"><span class="job_id">857 : Job ID 8820d29e13a74d7ab0caba6993f14817</span></button></div></a><div aria-labelledby="job_list___sub_heading_857_1" data-parent="#job_list___sub_accordion_857" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_857_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=951" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (951, 15), end pos: (951, 18)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 173</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -948,7 +948,7 @@ app.logger.warning("Missing required fields for watermarking: %s", payload) return jsonify( {"error": "method, intended_for, secret, and key are required"} - ), 400 + ), 399 # lookup the document; enforce ownership try:</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("id"), int) assert isinstance(data.get("documentid"), int) assert isinstance(data.get("link"), str) assert isinstance(data.get("intended_for"), str) assert isinstance(data.get("method"), str) assert isinstance(data.get("position"), str) assert isinstance(data.get("filename"), str) assert isinstance(data.get("size"), int) #check values assert data.get("documentid") == parameters["id"] assert data.get("intended_for") == parameters["intended_for"] assert data.get("method") == parameters["method"] assert data.get("position") == parameters["position"] #Tests with wrong parameters #Test with exact same call: should return database insertion error (Non unique entry) resp = client.post("/api/create-watermark", json=parameters) assert resp.status_code == 503 #Non existant method resp = client.post("/api/create-watermark", json={"method": "watermarkmethod", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Non existant document resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 8}) assert resp.status_code == 404 #Missing id resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"}) assert resp.status_code == 400 #Missing method resp = client.post("/api/create-watermark", json={"position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) &gt; assert resp.status_code == 400 E assert 399 == 400 E + where 399 = &lt;WrapperTestResponse streamed [399 UNKNOWN]&gt;.status_code ..\test\test_api.py:358: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1097 Integrity error during version insert for document 1: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b' for key 'uq_Versions_link'") [SQL: INSERT INTO Versions (documentid, link, intended_for, secret, method, position, path) VALUES (%(documentid)s, %(link)s, %(intended_for)s, %(secret)s, %(method)s, %(position)s, %(path)s) ] [parameters: {'documentid': 1, 'link': 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b', 'intended_for': 'Mickey Mouse', 'secret': 'secret', 'method': 'robust-xmp', 'position': 'metadata-only', 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username\\watermarks\\My File__Mickey_Mouse.pdf'}] (Background on this error at: https://sqlalche.me/e/20/gkpj) ERROR server:server.py:1007 Watermark applicability check failed for document 1: "Unknown watermarking method: 'watermarkmethod'. Known: ['overlay-watermark', 'robust-xmp', 'signed-annots']" WARNING server:server.py:972 Document not found or access denied for watermarking id=8 WARNING server:server.py:934 Missing document id in request WARNING server:server.py:948 Missing required fields for watermarking: {'id': 1, 'intended_for': 'Mickey Mouse', 'key': 'key', 'position': 'metadata-only', 'secret': 'secret'} ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 399 == 400 1 failed, 13 passed, 22 warnings in 20.11s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_858"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_858_1" aria-expanded="false" aria-controls="job_list___sub_collapse_858_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_858_1"><button class="btn btn-outline-danger"><span class="job_id">858 : Job ID 9105604e9226448d8e5482ee9bdf3a06</span></button></div></a><div aria-labelledby="job_list___sub_heading_858_1" data-parent="#job_list___sub_accordion_858" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_858_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=969" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (969, 57), end pos: (969, 60)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 174</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -966,7 +966,7 @@ ).first() except Exception as e: app.logger.error("Database error fetching document %s", e) - return jsonify({"error": "database error"}), 503 + return jsonify({"error": "database error"}), 504 if not row: app.logger.warning(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.22s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_859"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_859_1" aria-expanded="false" aria-controls="job_list___sub_collapse_859_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_859_1"><button class="btn btn-outline-danger"><span class="job_id">859 : Job ID 38fefa90e0194ea58d452611f297bd8c</span></button></div></a><div aria-labelledby="job_list___sub_heading_859_1" data-parent="#job_list___sub_accordion_859" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_859_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=969" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (969, 57), end pos: (969, 60)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 175</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -966,7 +966,7 @@ ).first() except Exception as e: app.logger.error("Database error fetching document %s", e) - return jsonify({"error": "database error"}), 503 + return jsonify({"error": "database error"}), 502 if not row: app.logger.warning(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.94s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_860"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_860_1" aria-expanded="false" aria-controls="job_list___sub_collapse_860_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_860_1"><button class="btn btn-outline-success"><span class="job_id">860 : Job ID e281aa70679c41d8b9ba7aeee586512a</span></button></div></a><div aria-labelledby="job_list___sub_heading_860_1" data-parent="#job_list___sub_accordion_860" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_860_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=975" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (975, 61), end pos: (975, 64)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 176</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -972,7 +972,7 @@ app.logger.warning( "Document not found or access denied for watermarking id=%s", doc_id ) - return jsonify({"error": "document not found"}), 404 + return jsonify({"error": "document not found"}), 405 # resolve path safely under STORAGE_DIR storage_root = Path(app.config["STORAGE_DIR"]).resolve()</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T144030632906Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 405 == 201 E + where 405 = &lt;WrapperTestResponse 31 bytes [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T144031711451Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 405 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 20.95s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_861"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_861_1" aria-expanded="false" aria-controls="job_list___sub_collapse_861_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_861_1"><button class="btn btn-outline-success"><span class="job_id">861 : Job ID 37b130a28e8042be8df08e3576cba286</span></button></div></a><div aria-labelledby="job_list___sub_heading_861_1" data-parent="#job_list___sub_accordion_861" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_861_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=975" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (975, 61), end pos: (975, 64)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 177</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -972,7 +972,7 @@ app.logger.warning( "Document not found or access denied for watermarking id=%s", doc_id ) - return jsonify({"error": "document not found"}), 404 + return jsonify({"error": "document not found"}), 403 # resolve path safely under STORAGE_DIR storage_root = Path(app.config["STORAGE_DIR"]).resolve()</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("id"), int) assert isinstance(data.get("documentid"), int) assert isinstance(data.get("link"), str) assert isinstance(data.get("intended_for"), str) assert isinstance(data.get("method"), str) assert isinstance(data.get("position"), str) assert isinstance(data.get("filename"), str) assert isinstance(data.get("size"), int) #check values assert data.get("documentid") == parameters["id"] assert data.get("intended_for") == parameters["intended_for"] assert data.get("method") == parameters["method"] assert data.get("position") == parameters["position"] #Tests with wrong parameters #Test with exact same call: should return database insertion error (Non unique entry) resp = client.post("/api/create-watermark", json=parameters) assert resp.status_code == 503 #Non existant method resp = client.post("/api/create-watermark", json={"method": "watermarkmethod", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Non existant document resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 8}) &gt; assert resp.status_code == 404 E assert 403 == 404 E + where 403 = &lt;WrapperTestResponse streamed [403 FORBIDDEN]&gt;.status_code ..\test\test_api.py:350: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1097 Integrity error during version insert for document 1: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b' for key 'uq_Versions_link'") [SQL: INSERT INTO Versions (documentid, link, intended_for, secret, method, position, path) VALUES (%(documentid)s, %(link)s, %(intended_for)s, %(secret)s, %(method)s, %(position)s, %(path)s) ] [parameters: {'documentid': 1, 'link': 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b', 'intended_for': 'Mickey Mouse', 'secret': 'secret', 'method': 'robust-xmp', 'position': 'metadata-only', 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username\\watermarks\\My File__Mickey_Mouse.pdf'}] (Background on this error at: https://sqlalche.me/e/20/gkpj) ERROR server:server.py:1007 Watermark applicability check failed for document 1: "Unknown watermarking method: 'watermarkmethod'. Known: ['overlay-watermark', 'robust-xmp', 'signed-annots']" WARNING server:server.py:972 Document not found or access denied for watermarking id=8 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 403 == 404 1 failed, 13 passed, 22 warnings in 20.15s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_862"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_862_1" aria-expanded="false" aria-controls="job_list___sub_collapse_862_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_862_1"><button class="btn btn-outline-danger"><span class="job_id">862 : Job ID 27baf1ed490340759af32b284945700f</span></button></div></a><div aria-labelledby="job_list___sub_heading_862_1" data-parent="#job_list___sub_accordion_862" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_862_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=987" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (987, 64), end pos: (987, 67)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 178</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -984,7 +984,7 @@ file_path.relative_to(storage_root) except ValueError: app.logger.warning("Rejected document path for id %s: %s", doc_id, row.path) - return jsonify({"error": "document path invalid"}), 500 + return jsonify({"error": "document path invalid"}), 501 if not file_path.exists(): app.logger.error("File missing on disk for document id=%s", doc_id) return jsonify({"error": "file missing on disk"}), 410</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.27s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_863"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_863_1" aria-expanded="false" aria-controls="job_list___sub_collapse_863_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_863_1"><button class="btn btn-outline-danger"><span class="job_id">863 : Job ID 6692ca600e6843299da1a793c4ad1f83</span></button></div></a><div aria-labelledby="job_list___sub_heading_863_1" data-parent="#job_list___sub_accordion_863" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_863_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=987" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (987, 64), end pos: (987, 67)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 179</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -984,7 +984,7 @@ file_path.relative_to(storage_root) except ValueError: app.logger.warning("Rejected document path for id %s: %s", doc_id, row.path) - return jsonify({"error": "document path invalid"}), 500 + return jsonify({"error": "document path invalid"}), 499 if not file_path.exists(): app.logger.error("File missing on disk for document id=%s", doc_id) return jsonify({"error": "file missing on disk"}), 410</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.61s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_864"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_864_1" aria-expanded="false" aria-controls="job_list___sub_collapse_864_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_864_1"><button class="btn btn-outline-danger"><span class="job_id">864 : Job ID 68cfd3512d634e71890d99da408fa9b3</span></button></div></a><div aria-labelledby="job_list___sub_heading_864_1" data-parent="#job_list___sub_accordion_864" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_864_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=990" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (990, 63), end pos: (990, 66)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 180</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -987,7 +987,7 @@ return jsonify({"error": "document path invalid"}), 500 if not file_path.exists(): app.logger.error("File missing on disk for document id=%s", doc_id) - return jsonify({"error": "file missing on disk"}), 410 + return jsonify({"error": "file missing on disk"}), 411 # check watermark applicability try:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.24s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_865"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_865_1" aria-expanded="false" aria-controls="job_list___sub_collapse_865_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_865_1"><button class="btn btn-outline-success"><span class="job_id">865 : Job ID b536356a03ce48dd820b582827b54165</span></button></div></a><div aria-labelledby="job_list___sub_heading_865_1" data-parent="#job_list___sub_accordion_865" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_865_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=990" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (990, 63), end pos: (990, 66)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 181</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -987,7 +987,7 @@ return jsonify({"error": "document path invalid"}), 500 if not file_path.exists(): app.logger.error("File missing on disk for document id=%s", doc_id) - return jsonify({"error": "file missing on disk"}), 410 + return jsonify({"error": "file missing on disk"}), 409 # check watermark applicability try:</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%]</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_866"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_866_1" aria-expanded="false" aria-controls="job_list___sub_collapse_866_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_866_1"><button class="btn btn-outline-danger"><span class="job_id">866 : Job ID 99b3782849dd49b9a62026daa4af3dba</span></button></div></a><div aria-labelledby="job_list___sub_heading_866_1" data-parent="#job_list___sub_accordion_866" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_866_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1004" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1004, 81), end pos: (1004, 84)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 182</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1001,7 +1001,7 @@ method, doc_id, ) - return jsonify({"error": "watermarking method not applicable"}), 400 + return jsonify({"error": "watermarking method not applicable"}), 401 except Exception as e: inc_watermark_failed(method, "applicability_exception") app.logger.error(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.07s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_867"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_867_1" aria-expanded="false" aria-controls="job_list___sub_collapse_867_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_867_1"><button class="btn btn-outline-danger"><span class="job_id">867 : Job ID de21c23675c44484b5560a8e30771639</span></button></div></a><div aria-labelledby="job_list___sub_heading_867_1" data-parent="#job_list___sub_accordion_867" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_867_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1004" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1004, 81), end pos: (1004, 84)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 183</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1001,7 +1001,7 @@ method, doc_id, ) - return jsonify({"error": "watermarking method not applicable"}), 400 + return jsonify({"error": "watermarking method not applicable"}), 399 except Exception as e: inc_watermark_failed(method, "applicability_exception") app.logger.error(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.44s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_868"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_868_1" aria-expanded="false" aria-controls="job_list___sub_collapse_868_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_868_1"><button class="btn btn-outline-success"><span class="job_id">868 : Job ID 8107e3167a6f4324adeda0b4f212b6a4</span></button></div></a><div aria-labelledby="job_list___sub_heading_868_1" data-parent="#job_list___sub_accordion_868" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_868_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1010" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1010, 79), end pos: (1010, 82)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 184</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1007,7 +1007,7 @@ app.logger.error( "Watermark applicability check failed for document %s: %s", doc_id, e ) - return jsonify({"error": "watermark applicability check failed"}), 400 + return jsonify({"error": "watermark applicability check failed"}), 401 # apply watermark  bytes try:</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("id"), int) assert isinstance(data.get("documentid"), int) assert isinstance(data.get("link"), str) assert isinstance(data.get("intended_for"), str) assert isinstance(data.get("method"), str) assert isinstance(data.get("position"), str) assert isinstance(data.get("filename"), str) assert isinstance(data.get("size"), int) #check values assert data.get("documentid") == parameters["id"] assert data.get("intended_for") == parameters["intended_for"] assert data.get("method") == parameters["method"] assert data.get("position") == parameters["position"] #Tests with wrong parameters #Test with exact same call: should return database insertion error (Non unique entry) resp = client.post("/api/create-watermark", json=parameters) assert resp.status_code == 503 #Non existant method resp = client.post("/api/create-watermark", json={"method": "watermarkmethod", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) &gt; assert resp.status_code == 400 E assert 401 == 400 E + where 401 = &lt;WrapperTestResponse streamed [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:346: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1097 Integrity error during version insert for document 1: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b' for key 'uq_Versions_link'") [SQL: INSERT INTO Versions (documentid, link, intended_for, secret, method, position, path) VALUES (%(documentid)s, %(link)s, %(intended_for)s, %(secret)s, %(method)s, %(position)s, %(path)s) ] [parameters: {'documentid': 1, 'link': 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b', 'intended_for': 'Mickey Mouse', 'secret': 'secret', 'method': 'robust-xmp', 'position': 'metadata-only', 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username\\watermarks\\My File__Mickey_Mouse.pdf'}] (Background on this error at: https://sqlalche.me/e/20/gkpj) ERROR server:server.py:1007 Watermark applicability check failed for document 1: "Unknown watermarking method: 'watermarkmethod'. Known: ['overlay-watermark', 'robust-xmp', 'signed-annots']" ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 401 == 400 1 failed, 13 passed, 22 warnings in 20.57s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_869"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_869_1" aria-expanded="false" aria-controls="job_list___sub_collapse_869_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_869_1"><button class="btn btn-outline-success"><span class="job_id">869 : Job ID e40f441446f04e8d891366c15385f0f6</span></button></div></a><div aria-labelledby="job_list___sub_heading_869_1" data-parent="#job_list___sub_accordion_869" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_869_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1010" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1010, 79), end pos: (1010, 82)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 185</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1007,7 +1007,7 @@ app.logger.error( "Watermark applicability check failed for document %s: %s", doc_id, e ) - return jsonify({"error": "watermark applicability check failed"}), 400 + return jsonify({"error": "watermark applicability check failed"}), 399 # apply watermark  bytes try:</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("id"), int) assert isinstance(data.get("documentid"), int) assert isinstance(data.get("link"), str) assert isinstance(data.get("intended_for"), str) assert isinstance(data.get("method"), str) assert isinstance(data.get("position"), str) assert isinstance(data.get("filename"), str) assert isinstance(data.get("size"), int) #check values assert data.get("documentid") == parameters["id"] assert data.get("intended_for") == parameters["intended_for"] assert data.get("method") == parameters["method"] assert data.get("position") == parameters["position"] #Tests with wrong parameters #Test with exact same call: should return database insertion error (Non unique entry) resp = client.post("/api/create-watermark", json=parameters) assert resp.status_code == 503 #Non existant method resp = client.post("/api/create-watermark", json={"method": "watermarkmethod", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) &gt; assert resp.status_code == 400 E assert 399 == 400 E + where 399 = &lt;WrapperTestResponse streamed [399 UNKNOWN]&gt;.status_code ..\test\test_api.py:346: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1097 Integrity error during version insert for document 1: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b' for key 'uq_Versions_link'") [SQL: INSERT INTO Versions (documentid, link, intended_for, secret, method, position, path) VALUES (%(documentid)s, %(link)s, %(intended_for)s, %(secret)s, %(method)s, %(position)s, %(path)s) ] [parameters: {'documentid': 1, 'link': 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b', 'intended_for': 'Mickey Mouse', 'secret': 'secret', 'method': 'robust-xmp', 'position': 'metadata-only', 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username\\watermarks\\My File__Mickey_Mouse.pdf'}] (Background on this error at: https://sqlalche.me/e/20/gkpj) ERROR server:server.py:1007 Watermark applicability check failed for document 1: "Unknown watermarking method: 'watermarkmethod'. Known: ['overlay-watermark', 'robust-xmp', 'signed-annots']" ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 399 == 400 1 failed, 13 passed, 22 warnings in 20.17s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_870"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_870_1" aria-expanded="false" aria-controls="job_list___sub_collapse_870_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_870_1"><button class="btn btn-outline-danger"><span class="job_id">870 : Job ID 9fd0b45538624811a95e734b582d6d1c</span></button></div></a><div aria-labelledby="job_list___sub_heading_870_1" data-parent="#job_list___sub_accordion_870" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_870_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1024" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1024, 81), end pos: (1024, 82)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 186</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1021,7 +1021,7 @@ position=position, ) observe_watermark_duration(method, time.time() - _wm_start) - if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: + if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 1: inc_watermark_failed(method, "empty_output") app.logger.error( "Watermarking produced no output for document %s using method %s",</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.06s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_871"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_871_1" aria-expanded="false" aria-controls="job_list___sub_collapse_871_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_871_1"><button class="btn btn-outline-danger"><span class="job_id">871 : Job ID d44226ffdfb64629ac2ec91ad2b2605d</span></button></div></a><div aria-labelledby="job_list___sub_heading_871_1" data-parent="#job_list___sub_accordion_871" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_871_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1024" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1024, 81), end pos: (1024, 82)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 187</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1021,7 +1021,7 @@ position=position, ) observe_watermark_duration(method, time.time() - _wm_start) - if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == 0: + if not isinstance(wm_bytes, (bytes | bytearray)) or len(wm_bytes) == -1: inc_watermark_failed(method, "empty_output") app.logger.error( "Watermarking produced no output for document %s using method %s",</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.05s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_872"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_872_1" aria-expanded="false" aria-controls="job_list___sub_collapse_872_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_872_1"><button class="btn btn-outline-danger"><span class="job_id">872 : Job ID 0e1362f855e34fe6b71323ffe1c78b0b</span></button></div></a><div aria-labelledby="job_list___sub_heading_872_1" data-parent="#job_list___sub_accordion_872" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_872_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1031" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1031, 78), end pos: (1031, 81)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 188</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1028,7 +1028,7 @@ doc_id, method, ) - return jsonify({"error": "watermarking produced no output"}), 500 + return jsonify({"error": "watermarking produced no output"}), 501 except Exception as e: inc_watermark_failed(method, "exception") app.logger.error(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.17s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_873"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_873_1" aria-expanded="false" aria-controls="job_list___sub_collapse_873_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_873_1"><button class="btn btn-outline-danger"><span class="job_id">873 : Job ID 28ceb90fa13349499f4adf6ed7abe878</span></button></div></a><div aria-labelledby="job_list___sub_heading_873_1" data-parent="#job_list___sub_accordion_873" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_873_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1031" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1031, 78), end pos: (1031, 81)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 189</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1028,7 +1028,7 @@ doc_id, method, ) - return jsonify({"error": "watermarking produced no output"}), 500 + return jsonify({"error": "watermarking produced no output"}), 499 except Exception as e: inc_watermark_failed(method, "exception") app.logger.error(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.11s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_874"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_874_1" aria-expanded="false" aria-controls="job_list___sub_collapse_874_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_874_1"><button class="btn btn-outline-danger"><span class="job_id">874 : Job ID b26bd12b00564c02a2d4480c9e1f30db</span></button></div></a><div aria-labelledby="job_list___sub_heading_874_1" data-parent="#job_list___sub_accordion_874" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_874_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1040" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1040, 62), end pos: (1040, 65)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 190</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1037,7 +1037,7 @@ method, e, ) - return jsonify({"error": "watermarking failed"}), 500 + return jsonify({"error": "watermarking failed"}), 501 # build destination file name: "&lt;original_name&gt;__&lt;intended_to&gt;.pdf" base_name = Path(row.name or file_path.name).stem</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.44s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_875"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_875_1" aria-expanded="false" aria-controls="job_list___sub_collapse_875_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_875_1"><button class="btn btn-outline-success"><span class="job_id">875 : Job ID 712feaf1788a4eb1966083fa0d0e1957</span></button></div></a><div aria-labelledby="job_list___sub_heading_875_1" data-parent="#job_list___sub_accordion_875" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_875_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1040" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1040, 62), end pos: (1040, 65)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 191</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1037,7 +1037,7 @@ method, e, ) - return jsonify({"error": "watermarking failed"}), 500 + return jsonify({"error": "watermarking failed"}), 499 # build destination file name: "&lt;original_name&gt;__&lt;intended_to&gt;.pdf" base_name = Path(row.name or file_path.name).stem</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T024547761980Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T024548738664Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.50s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_876"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_876_1" aria-expanded="false" aria-controls="job_list___sub_collapse_876_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_876_1"><button class="btn btn-outline-danger"><span class="job_id">876 : Job ID fcff9fb02cf648279fb64213c5f30393</span></button></div></a><div aria-labelledby="job_list___sub_heading_876_1" data-parent="#job_list___sub_accordion_876" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_876_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1062" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1062, 75), end pos: (1062, 78)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 192</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1059,7 +1059,7 @@ doc_id, e, ) - return jsonify({"error": "failed to write watermarked file"}), 500 + return jsonify({"error": "failed to write watermarked file"}), 501 # link token = sha256(watermarked_file_name) - using stronger hash link_token = hashlib.sha256(candidate.encode("utf-8")).hexdigest()</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.11s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_877"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_877_1" aria-expanded="false" aria-controls="job_list___sub_collapse_877_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_877_1"><button class="btn btn-outline-success"><span class="job_id">877 : Job ID db8dea4fb47940b592949183faaa2cd7</span></button></div></a><div aria-labelledby="job_list___sub_heading_877_1" data-parent="#job_list___sub_accordion_877" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_877_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1062" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1062, 75), end pos: (1062, 78)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 193</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1059,7 +1059,7 @@ doc_id, e, ) - return jsonify({"error": "failed to write watermarked file"}), 500 + return jsonify({"error": "failed to write watermarked file"}), 499 # link token = sha256(watermarked_file_name) - using stronger hash link_token = hashlib.sha256(candidate.encode("utf-8")).hexdigest()</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T174027273183Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T174028142462Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.60s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_878"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_878_1" aria-expanded="false" aria-controls="job_list___sub_collapse_878_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_878_1"><button class="btn btn-outline-success"><span class="job_id">878 : Job ID 434917827e7c41298a4300df20865edc</span></button></div></a><div aria-labelledby="job_list___sub_heading_878_1" data-parent="#job_list___sub_accordion_878" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_878_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1101" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1101, 79), end pos: (1101, 82)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 194</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1098,7 +1098,7 @@ "Integrity error during version insert for document %s: %s", doc_id, ie ) inc_db_error("insert_version") - return jsonify({"error": "database error during version insert"}), 503 + return jsonify({"error": "database error during version insert"}), 504 except Exception: try: dest_path.unlink(missing_ok=True)</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("id"), int) assert isinstance(data.get("documentid"), int) assert isinstance(data.get("link"), str) assert isinstance(data.get("intended_for"), str) assert isinstance(data.get("method"), str) assert isinstance(data.get("position"), str) assert isinstance(data.get("filename"), str) assert isinstance(data.get("size"), int) #check values assert data.get("documentid") == parameters["id"] assert data.get("intended_for") == parameters["intended_for"] assert data.get("method") == parameters["method"] assert data.get("position") == parameters["position"] #Tests with wrong parameters #Test with exact same call: should return database insertion error (Non unique entry) resp = client.post("/api/create-watermark", json=parameters) &gt; assert resp.status_code == 503 E assert 504 == 503 E + where 504 = &lt;WrapperTestResponse streamed [504 GATEWAY TIMEOUT]&gt;.status_code ..\test\test_api.py:342: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1097 Integrity error during version insert for document 1: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b' for key 'uq_Versions_link'") [SQL: INSERT INTO Versions (documentid, link, intended_for, secret, method, position, path) VALUES (%(documentid)s, %(link)s, %(intended_for)s, %(secret)s, %(method)s, %(position)s, %(path)s) ] [parameters: {'documentid': 1, 'link': 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b', 'intended_for': 'Mickey Mouse', 'secret': 'secret', 'method': 'robust-xmp', 'position': 'metadata-only', 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username\\watermarks\\My File__Mickey_Mouse.pdf'}] (Background on this error at: https://sqlalche.me/e/20/gkpj) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 504 == 503 1 failed, 13 passed, 22 warnings in 21.26s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_879"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_879_1" aria-expanded="false" aria-controls="job_list___sub_collapse_879_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_879_1"><button class="btn btn-outline-success"><span class="job_id">879 : Job ID bacaf556b940444f9870af9d42f98caa</span></button></div></a><div aria-labelledby="job_list___sub_heading_879_1" data-parent="#job_list___sub_accordion_879" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_879_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1101" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1101, 79), end pos: (1101, 82)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 195</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1098,7 +1098,7 @@ "Integrity error during version insert for document %s: %s", doc_id, ie ) inc_db_error("insert_version") - return jsonify({"error": "database error during version insert"}), 503 + return jsonify({"error": "database error during version insert"}), 502 except Exception: try: dest_path.unlink(missing_ok=True)</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e5f22414358e84166: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 20.00s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_880"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_880_1" aria-expanded="false" aria-controls="job_list___sub_collapse_880_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_880_1"><button class="btn btn-outline-danger"><span class="job_id">880 : Job ID 7bd03a05e770411b85190d7b01ee84a8</span></button></div></a><div aria-labelledby="job_list___sub_heading_880_1" data-parent="#job_list___sub_accordion_880" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_880_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1113" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1113, 79), end pos: (1113, 82)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 196</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1110,7 +1110,7 @@ "Database error during version insert for document %s", doc_id ) inc_db_error("insert_version") - return jsonify({"error": "database error during version insert"}), 503 + return jsonify({"error": "database error during version insert"}), 504 inc_watermark_created(method) return jsonify(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.99s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_881"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_881_1" aria-expanded="false" aria-controls="job_list___sub_collapse_881_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_881_1"><button class="btn btn-outline-danger"><span class="job_id">881 : Job ID 1421f985bc3d4a99ace23bc0de9a855f</span></button></div></a><div aria-labelledby="job_list___sub_heading_881_1" data-parent="#job_list___sub_accordion_881" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_881_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1113" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1113, 79), end pos: (1113, 82)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 197</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1110,7 +1110,7 @@ "Database error during version insert for document %s", doc_id ) inc_db_error("insert_version") - return jsonify({"error": "database error during version insert"}), 503 + return jsonify({"error": "database error during version insert"}), 502 inc_watermark_created(method) return jsonify(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.12s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_882"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_882_1" aria-expanded="false" aria-controls="job_list___sub_collapse_882_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_882_1"><button class="btn btn-outline-success"><span class="job_id">882 : Job ID 5fb3c0b9a06148df8dda461e37ea9496</span></button></div></a><div aria-labelledby="job_list___sub_heading_882_1" data-parent="#job_list___sub_accordion_882" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_882_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1127" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1127, 11), end pos: (1127, 14)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 198</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1124,7 +1124,7 @@ "filename": candidate, "size": len(wm_bytes), } - ), 201 + ), 202 # GET /api/get-watermarking-methods #  {"methods":[{"name":..., "description":...}, ...], "count":N}</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T223255420613Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T223256376031Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.65s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_883"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_883_1" aria-expanded="false" aria-controls="job_list___sub_collapse_883_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_883_1"><button class="btn btn-outline-success"><span class="job_id">883 : Job ID f535402b1c9e450dbf425a8aa8bd44fc</span></button></div></a><div aria-labelledby="job_list___sub_heading_883_1" data-parent="#job_list___sub_accordion_883" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_883_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1127" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1127, 11), end pos: (1127, 14)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 199</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1124,7 +1124,7 @@ "filename": candidate, "size": len(wm_bytes), } - ), 201 + ), 200 # GET /api/get-watermarking-methods #  {"methods":[{"name":..., "description":...}, ...], "count":N}</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T014054813869Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T014055692569Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.22s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_884"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_884_1" aria-expanded="false" aria-controls="job_list___sub_collapse_884_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_884_1"><button class="btn btn-outline-success"><span class="job_id">884 : Job ID 0efbf025db974e52aaaadc9e92d6557e</span></button></div></a><div aria-labelledby="job_list___sub_heading_884_1" data-parent="#job_list___sub_accordion_884" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_884_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1140" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1140, 69), end pos: (1140, 72)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 200</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1137,7 +1137,7 @@ {"name": m, "description": WMUtils.get_method(m).get_usage()} ) - return jsonify({"methods": methods, "count": len(methods)}), 200 + return jsonify({"methods": methods, "count": len(methods)}), 201 # POST /api/read-watermark @app.post("/api/read-watermark")</pre></div><div class="alert alert-secondary"><pre class="diff">...F....FFFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _____________________ test_get_watermarking_methods_route _____________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_watermarking_methods_route(client): """Test get watermarking methods endpoint.""" resp = client.get("/api/get-watermarking-methods") data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 201 == 200 E + where 201 = &lt;WrapperTestResponse 532 bytes [201 CREATED]&gt;.status_code ..\test\test_api.py:301: AssertionError _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e3bdbc103784a3655: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_get_watermarking_methods_route - assert 201 ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 6 failed, 8 passed, 22 warnings in 19.68s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_885"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_885_1" aria-expanded="false" aria-controls="job_list___sub_collapse_885_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_885_1"><button class="btn btn-outline-success"><span class="job_id">885 : Job ID 68371594ec5e40a0a694a6096ad65a9c</span></button></div></a><div aria-labelledby="job_list___sub_heading_885_1" data-parent="#job_list___sub_accordion_885" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_885_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1140" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1140, 69), end pos: (1140, 72)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 201</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1137,7 +1137,7 @@ {"name": m, "description": WMUtils.get_method(m).get_usage()} ) - return jsonify({"methods": methods, "count": len(methods)}), 200 + return jsonify({"methods": methods, "count": len(methods)}), 199 # POST /api/read-watermark @app.post("/api/read-watermark")</pre></div><div class="alert alert-secondary"><pre class="diff">........F..... [100%] ================================== FAILURES =================================== _____________________ test_get_watermarking_methods_route _____________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_watermarking_methods_route(client): """Test get watermarking methods endpoint.""" resp = client.get("/api/get-watermarking-methods") &gt; data = resp.get_json() ^^^^^^^^^^^^^^^ ..\test\test_api.py:298: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\response.py:620: in get_json return self.json_module.loads(data) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\json\provider.py:187: in loads return json.loads(s, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\json\__init__.py:346: in loads return _default_decoder.decode(s) ^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\json\decoder.py:337: in decode obj, end = self.raw_decode(s, idx=_w(s, 0).end()) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = &lt;json.decoder.JSONDecoder object at 0x0000024EB7458680&gt;, s = '', idx = 0 def raw_decode(self, s, idx=0): """Decode a JSON document from ``s`` (a ``str`` beginning with a JSON document) and return a 2-tuple of the Python representation and the index in ``s`` where the document ended. This can be used to decode a JSON document from a string that may have extraneous data at the end. """ try: obj, end = self.scan_once(s, idx) except StopIteration as err: &gt; raise JSONDecodeError("Expecting value", s, err.value) from None E json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\json\decoder.py:355: JSONDecodeError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_get_watermarking_methods_route - json.decode... 1 failed, 13 passed, 22 warnings in 20.35s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_886"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_886_1" aria-expanded="false" aria-controls="job_list___sub_collapse_886_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_886_1"><button class="btn btn-outline-danger"><span class="job_id">886 : Job ID 2af69b7447ab4862b1694162d9a62f46</span></button></div></a><div aria-labelledby="job_list___sub_heading_886_1" data-parent="#job_list___sub_accordion_886" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_886_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1158" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1158, 63), end pos: (1158, 66)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 202</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1155,7 +1155,7 @@ doc_id = document_id except (TypeError, ValueError): app.logger.warning("Invalid document id in query: %s", document_id) - return jsonify({"error": "document id required"}), 400 + return jsonify({"error": "document id required"}), 401 payload = request.get_json(silent=True) or {} # allow a couple of aliases for convenience</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.89s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_887"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_887_1" aria-expanded="false" aria-controls="job_list___sub_collapse_887_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_887_1"><button class="btn btn-outline-danger"><span class="job_id">887 : Job ID 8a1707a943214e708d098395103e540e</span></button></div></a><div aria-labelledby="job_list___sub_heading_887_1" data-parent="#job_list___sub_accordion_887" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_887_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1158" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1158, 63), end pos: (1158, 66)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 203</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1155,7 +1155,7 @@ doc_id = document_id except (TypeError, ValueError): app.logger.warning("Invalid document id in query: %s", document_id) - return jsonify({"error": "document id required"}), 400 + return jsonify({"error": "document id required"}), 399 payload = request.get_json(silent=True) or {} # allow a couple of aliases for convenience</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.45s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_888"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_888_1" aria-expanded="false" aria-controls="job_list___sub_collapse_888_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_888_1"><button class="btn btn-outline-success"><span class="job_id">888 : Job ID d9d4b7be11124a6691bcf1630c61efc4</span></button></div></a><div aria-labelledby="job_list___sub_heading_888_1" data-parent="#job_list___sub_accordion_888" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_888_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1170" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1170, 76), end pos: (1170, 79)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 204</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1167,7 +1167,7 @@ try: if doc_id is None: app.logger.warning("Missing document id in request") - return jsonify({"error": "document_id (int) is required"}), 400 + return jsonify({"error": "document_id (int) is required"}), 401 doc_id = int(doc_id) if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T210905041869Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T210906029780Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 11 failed, 3 passed, 22 warnings in 21.07s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_889"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_889_1" aria-expanded="false" aria-controls="job_list___sub_collapse_889_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_889_1"><button class="btn btn-outline-success"><span class="job_id">889 : Job ID b5d812cebc7d4154ad19f1c5d60e22cf</span></button></div></a><div aria-labelledby="job_list___sub_heading_889_1" data-parent="#job_list___sub_accordion_889" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_889_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1170" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1170, 76), end pos: (1170, 79)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 205</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1167,7 +1167,7 @@ try: if doc_id is None: app.logger.warning("Missing document id in request") - return jsonify({"error": "document_id (int) is required"}), 400 + return jsonify({"error": "document_id (int) is required"}), 399 doc_id = int(doc_id) if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400</pre></div><div class="alert alert-secondary"><pre class="diff">..........F... [100%] ================================== FAILURES =================================== __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("documentid"), int) assert isinstance(data.get("secret"), str) assert isinstance(data.get("method"), str) assert isinstance(data.get("position"), str) #check values assert data.get("documentid") == parameters["id"] assert data.get("method") == parameters["method"] assert data.get("position") == parameters["position"] #Tests with wrong parameters #Non existant id resp = client.post("/api/read-watermark", json={"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 8}) assert resp.status_code == 404 #Missing id resp = client.post("/api/read-watermark", json={"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"}) &gt; assert resp.status_code == 400 E assert 399 == 400 E + where 399 = &lt;WrapperTestResponse streamed [399 UNKNOWN]&gt;.status_code ..\test\test_api.py:422: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:1202 Document not found or access denied for watermark read id=8 WARNING server:server.py:1169 Missing document id in request ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_read_watermark_route - assert 399 == 400 1 failed, 13 passed, 22 warnings in 20.31s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_890"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_890_1" aria-expanded="false" aria-controls="job_list___sub_collapse_890_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_890_1"><button class="btn btn-outline-danger"><span class="job_id">890 : Job ID bd4b6d8ae0304eb3a94af8c544944405</span></button></div></a><div aria-labelledby="job_list___sub_heading_890_1" data-parent="#job_list___sub_accordion_890" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_890_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1172" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1172, 25), end pos: (1172, 26)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 206</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1169,7 +1169,7 @@ app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) - if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: + if doc_id &lt;= 1 or doc_id &gt; MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.08s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_891"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_891_1" aria-expanded="false" aria-controls="job_list___sub_collapse_891_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_891_1"><button class="btn btn-outline-danger"><span class="job_id">891 : Job ID 30cb23535b954c5b97a71850f1a51ced</span></button></div></a><div aria-labelledby="job_list___sub_heading_891_1" data-parent="#job_list___sub_accordion_891" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_891_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1172" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1172, 25), end pos: (1172, 26)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 207</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1169,7 +1169,7 @@ app.logger.warning("Missing document id in request") return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) - if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: + if doc_id &lt;= -1 or doc_id &gt; MAX_DB_INT: return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.65s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_892"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_892_1" aria-expanded="false" aria-controls="job_list___sub_collapse_892_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_892_1"><button class="btn btn-outline-success"><span class="job_id">892 : Job ID 036979e0fe1341d793dd33b7f94f43f9</span></button></div></a><div aria-labelledby="job_list___sub_heading_892_1" data-parent="#job_list___sub_accordion_892" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_892_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1173" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1173, 76), end pos: (1173, 79)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 208</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1170,7 +1170,7 @@ return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: - return jsonify({"error": "document_id (int) is required"}), 400 + return jsonify({"error": "document_id (int) is required"}), 401 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id) return jsonify({"error": "document_id (int) is required"}), 400</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e00d6d9506a3bdffd: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 22.02s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_893"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_893_1" aria-expanded="false" aria-controls="job_list___sub_collapse_893_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_893_1"><button class="btn btn-outline-danger"><span class="job_id">893 : Job ID 52bce73c250d4f9fa9f5bd9fdefcd9e3</span></button></div></a><div aria-labelledby="job_list___sub_heading_893_1" data-parent="#job_list___sub_accordion_893" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_893_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1173" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1173, 76), end pos: (1173, 79)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 209</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1170,7 +1170,7 @@ return jsonify({"error": "document_id (int) is required"}), 400 doc_id = int(doc_id) if doc_id &lt;= 0 or doc_id &gt; MAX_DB_INT: - return jsonify({"error": "document_id (int) is required"}), 400 + return jsonify({"error": "document_id (int) is required"}), 399 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id) return jsonify({"error": "document_id (int) is required"}), 400</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.97s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_894"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_894_1" aria-expanded="false" aria-controls="job_list___sub_collapse_894_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_894_1"><button class="btn btn-outline-danger"><span class="job_id">894 : Job ID 3a50e0934f4948da998c4c70f19d56f9</span></button></div></a><div aria-labelledby="job_list___sub_heading_894_1" data-parent="#job_list___sub_accordion_894" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_894_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1176" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1176, 72), end pos: (1176, 75)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 210</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1173,7 +1173,7 @@ return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id) - return jsonify({"error": "document_id (int) is required"}), 400 + return jsonify({"error": "document_id (int) is required"}), 401 if not method or not isinstance(method, str) or not isinstance(key, str): app.logger.warning("Missing required fields for watermarking: %s", payload) return jsonify({"error": "method, and key are required"}), 400</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.07s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_895"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_895_1" aria-expanded="false" aria-controls="job_list___sub_collapse_895_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_895_1"><button class="btn btn-outline-danger"><span class="job_id">895 : Job ID 4480f7e719254b159734a36737895a4f</span></button></div></a><div aria-labelledby="job_list___sub_heading_895_1" data-parent="#job_list___sub_accordion_895" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_895_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1176" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1176, 72), end pos: (1176, 75)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 211</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1173,7 +1173,7 @@ return jsonify({"error": "document_id (int) is required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id: %s", document_id) - return jsonify({"error": "document_id (int) is required"}), 400 + return jsonify({"error": "document_id (int) is required"}), 399 if not method or not isinstance(method, str) or not isinstance(key, str): app.logger.warning("Missing required fields for watermarking: %s", payload) return jsonify({"error": "method, and key are required"}), 400</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.74s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_896"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_896_1" aria-expanded="false" aria-controls="job_list___sub_collapse_896_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_896_1"><button class="btn btn-outline-success"><span class="job_id">896 : Job ID 98c8e639b69647f4a4d9db1cafd58b46</span></button></div></a><div aria-labelledby="job_list___sub_heading_896_1" data-parent="#job_list___sub_accordion_896" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_896_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1179" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1179, 71), end pos: (1179, 74)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 212</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1176,7 +1176,7 @@ return jsonify({"error": "document_id (int) is required"}), 400 if not method or not isinstance(method, str) or not isinstance(key, str): app.logger.warning("Missing required fields for watermarking: %s", payload) - return jsonify({"error": "method, and key are required"}), 400 + return jsonify({"error": "method, and key are required"}), 401 # lookup the document; enforce ownership try:</pre></div><div class="alert alert-secondary"><pre class="diff">..........F... [100%] ================================== FAILURES =================================== __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("documentid"), int) assert isinstance(data.get("secret"), str) assert isinstance(data.get("method"), str) assert isinstance(data.get("position"), str) #check values assert data.get("documentid") == parameters["id"] assert data.get("method") == parameters["method"] assert data.get("position") == parameters["position"] #Tests with wrong parameters #Non existant id resp = client.post("/api/read-watermark", json={"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 8}) assert resp.status_code == 404 #Missing id resp = client.post("/api/read-watermark", json={"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"}) assert resp.status_code == 400 #Missing method resp = client.post("/api/read-watermark", json={"position": "metadata-only", "key": "strong-password", "id": 2}) &gt; assert resp.status_code == 400 E assert 401 == 400 E + where 401 = &lt;WrapperTestResponse streamed [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:426: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:1202 Document not found or access denied for watermark read id=8 WARNING server:server.py:1169 Missing document id in request WARNING server:server.py:1178 Missing required fields for watermarking: {'id': 2, 'key': 'strong-password', 'position': 'metadata-only'} ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_read_watermark_route - assert 401 == 400 1 failed, 13 passed, 22 warnings in 20.06s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_897"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_897_1" aria-expanded="false" aria-controls="job_list___sub_collapse_897_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_897_1"><button class="btn btn-outline-success"><span class="job_id">897 : Job ID f7b67325edd64d22a6a4670cbb9104f0</span></button></div></a><div aria-labelledby="job_list___sub_heading_897_1" data-parent="#job_list___sub_accordion_897" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_897_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1179" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1179, 71), end pos: (1179, 74)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 213</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1176,7 +1176,7 @@ return jsonify({"error": "document_id (int) is required"}), 400 if not method or not isinstance(method, str) or not isinstance(key, str): app.logger.warning("Missing required fields for watermarking: %s", payload) - return jsonify({"error": "method, and key are required"}), 400 + return jsonify({"error": "method, and key are required"}), 399 # lookup the document; enforce ownership try:</pre></div><div class="alert alert-secondary"><pre class="diff">..........F... [100%] ================================== FAILURES =================================== __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("documentid"), int) assert isinstance(data.get("secret"), str) assert isinstance(data.get("method"), str) assert isinstance(data.get("position"), str) #check values assert data.get("documentid") == parameters["id"] assert data.get("method") == parameters["method"] assert data.get("position") == parameters["position"] #Tests with wrong parameters #Non existant id resp = client.post("/api/read-watermark", json={"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 8}) assert resp.status_code == 404 #Missing id resp = client.post("/api/read-watermark", json={"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"}) assert resp.status_code == 400 #Missing method resp = client.post("/api/read-watermark", json={"position": "metadata-only", "key": "strong-password", "id": 2}) &gt; assert resp.status_code == 400 E assert 399 == 400 E + where 399 = &lt;WrapperTestResponse streamed [399 UNKNOWN]&gt;.status_code ..\test\test_api.py:426: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:1202 Document not found or access denied for watermark read id=8 WARNING server:server.py:1169 Missing document id in request WARNING server:server.py:1178 Missing required fields for watermarking: {'id': 2, 'key': 'strong-password', 'position': 'metadata-only'} ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_read_watermark_route - assert 399 == 400 1 failed, 13 passed, 22 warnings in 20.16s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_898"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_898_1" aria-expanded="false" aria-controls="job_list___sub_collapse_898_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_898_1"><button class="btn btn-outline-danger"><span class="job_id">898 : Job ID 11e93a96dd0644df88694919a2c9556e</span></button></div></a><div aria-labelledby="job_list___sub_heading_898_1" data-parent="#job_list___sub_accordion_898" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_898_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1199" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1199, 57), end pos: (1199, 60)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 214</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1196,7 +1196,7 @@ app.logger.error( "Database error fetching document %s for watermark read: %s", doc_id, e ) - return jsonify({"error": "database error"}), 503 + return jsonify({"error": "database error"}), 504 if not row: app.logger.warning(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.24s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_899"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_899_1" aria-expanded="false" aria-controls="job_list___sub_collapse_899_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_899_1"><button class="btn btn-outline-danger"><span class="job_id">899 : Job ID 72657d3105fc41c2b4f783a02090a6e1</span></button></div></a><div aria-labelledby="job_list___sub_heading_899_1" data-parent="#job_list___sub_accordion_899" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_899_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1199" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1199, 57), end pos: (1199, 60)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 215</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1196,7 +1196,7 @@ app.logger.error( "Database error fetching document %s for watermark read: %s", doc_id, e ) - return jsonify({"error": "database error"}), 503 + return jsonify({"error": "database error"}), 502 if not row: app.logger.warning(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.35s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_900"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_900_1" aria-expanded="false" aria-controls="job_list___sub_collapse_900_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_900_1"><button class="btn btn-outline-success"><span class="job_id">900 : Job ID 4b99cb352e994df38d87eb25c8abbe71</span></button></div></a><div aria-labelledby="job_list___sub_heading_900_1" data-parent="#job_list___sub_accordion_900" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_900_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1205" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1205, 61), end pos: (1205, 64)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 216</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1202,7 +1202,7 @@ app.logger.warning( "Document not found or access denied for watermark read id=%s", doc_id ) - return jsonify({"error": "document not found"}), 404 + return jsonify({"error": "document not found"}), 405 # resolve path safely under STORAGE_DIR storage_root = Path(app.config["STORAGE_DIR"]).resolve()</pre></div><div class="alert alert-secondary"><pre class="diff">..........F... [100%] ================================== FAILURES =================================== __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("documentid"), int) assert isinstance(data.get("secret"), str) assert isinstance(data.get("method"), str) assert isinstance(data.get("position"), str) #check values assert data.get("documentid") == parameters["id"] assert data.get("method") == parameters["method"] assert data.get("position") == parameters["position"] #Tests with wrong parameters #Non existant id resp = client.post("/api/read-watermark", json={"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 8}) &gt; assert resp.status_code == 404 E assert 405 == 404 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:417: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:1202 Document not found or access denied for watermark read id=8 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_read_watermark_route - assert 405 == 404 1 failed, 13 passed, 22 warnings in 19.92s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_901"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_901_1" aria-expanded="false" aria-controls="job_list___sub_collapse_901_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_901_1"><button class="btn btn-outline-success"><span class="job_id">901 : Job ID 1d9c6ed0190a4e01b8eba65ce4cac3e3</span></button></div></a><div aria-labelledby="job_list___sub_heading_901_1" data-parent="#job_list___sub_accordion_901" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_901_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1205" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1205, 61), end pos: (1205, 64)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 217</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1202,7 +1202,7 @@ app.logger.warning( "Document not found or access denied for watermark read id=%s", doc_id ) - return jsonify({"error": "document not found"}), 404 + return jsonify({"error": "document not found"}), 403 # resolve path safely under STORAGE_DIR storage_root = Path(app.config["STORAGE_DIR"]).resolve()</pre></div><div class="alert alert-secondary"><pre class="diff">..........F... [100%] ================================== FAILURES =================================== __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("documentid"), int) assert isinstance(data.get("secret"), str) assert isinstance(data.get("method"), str) assert isinstance(data.get("position"), str) #check values assert data.get("documentid") == parameters["id"] assert data.get("method") == parameters["method"] assert data.get("position") == parameters["position"] #Tests with wrong parameters #Non existant id resp = client.post("/api/read-watermark", json={"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 8}) &gt; assert resp.status_code == 404 E assert 403 == 404 E + where 403 = &lt;WrapperTestResponse streamed [403 FORBIDDEN]&gt;.status_code ..\test\test_api.py:417: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:1202 Document not found or access denied for watermark read id=8 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_read_watermark_route - assert 403 == 404 1 failed, 13 passed, 22 warnings in 21.74s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_902"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_902_1" aria-expanded="false" aria-controls="job_list___sub_collapse_902_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_902_1"><button class="btn btn-outline-danger"><span class="job_id">902 : Job ID 2df16cc549a44cb1801051cafebb7cbf</span></button></div></a><div aria-labelledby="job_list___sub_heading_902_1" data-parent="#job_list___sub_accordion_902" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_902_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1217" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1217, 64), end pos: (1217, 67)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 218</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1214,7 +1214,7 @@ file_path.relative_to(storage_root) except ValueError: app.logger.warning("Rejected document path for id %s: %s", doc_id, row.path) - return jsonify({"error": "document path invalid"}), 500 + return jsonify({"error": "document path invalid"}), 501 if not file_path.exists(): app.logger.error("File missing on disk for document id=%s", doc_id) return jsonify({"error": "file missing on disk"}), 410</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.04s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_903"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_903_1" aria-expanded="false" aria-controls="job_list___sub_collapse_903_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_903_1"><button class="btn btn-outline-danger"><span class="job_id">903 : Job ID ecbf847e2ced44dc8ebb696a0c47631e</span></button></div></a><div aria-labelledby="job_list___sub_heading_903_1" data-parent="#job_list___sub_accordion_903" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_903_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1217" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1217, 64), end pos: (1217, 67)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 219</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1214,7 +1214,7 @@ file_path.relative_to(storage_root) except ValueError: app.logger.warning("Rejected document path for id %s: %s", doc_id, row.path) - return jsonify({"error": "document path invalid"}), 500 + return jsonify({"error": "document path invalid"}), 499 if not file_path.exists(): app.logger.error("File missing on disk for document id=%s", doc_id) return jsonify({"error": "file missing on disk"}), 410</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.42s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_904"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_904_1" aria-expanded="false" aria-controls="job_list___sub_collapse_904_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_904_1"><button class="btn btn-outline-danger"><span class="job_id">904 : Job ID 2062410c6c8c4866894344c96fada517</span></button></div></a><div aria-labelledby="job_list___sub_heading_904_1" data-parent="#job_list___sub_accordion_904" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_904_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1220" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1220, 63), end pos: (1220, 66)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 220</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1217,7 +1217,7 @@ return jsonify({"error": "document path invalid"}), 500 if not file_path.exists(): app.logger.error("File missing on disk for document id=%s", doc_id) - return jsonify({"error": "file missing on disk"}), 410 + return jsonify({"error": "file missing on disk"}), 411 secret = None try:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.24s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_905"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_905_1" aria-expanded="false" aria-controls="job_list___sub_collapse_905_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_905_1"><button class="btn btn-outline-danger"><span class="job_id">905 : Job ID 374bb0a45b13457da3230a6535f1b2ba</span></button></div></a><div aria-labelledby="job_list___sub_heading_905_1" data-parent="#job_list___sub_accordion_905" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_905_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1220" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1220, 63), end pos: (1220, 66)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 221</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1217,7 +1217,7 @@ return jsonify({"error": "document path invalid"}), 500 if not file_path.exists(): app.logger.error("File missing on disk for document id=%s", doc_id) - return jsonify({"error": "file missing on disk"}), 410 + return jsonify({"error": "file missing on disk"}), 409 secret = None try:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.10s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_906"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_906_1" aria-expanded="false" aria-controls="job_list___sub_collapse_906_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_906_1"><button class="btn btn-outline-danger"><span class="job_id">906 : Job ID 5ac1dfa7bf2d4554a5783532b49243ca</span></button></div></a><div aria-labelledby="job_list___sub_heading_906_1" data-parent="#job_list___sub_accordion_906" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_906_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1229" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1229, 82), end pos: (1229, 85)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 222</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1226,7 +1226,7 @@ app.logger.error( "Error when attempting to read watermark for document %s: %s", doc_id, e ) - return jsonify({"error": "error when attempting to read watermark"}), 400 + return jsonify({"error": "error when attempting to read watermark"}), 401 inc_watermark_read(method) return jsonify( {</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.77s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_907"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_907_1" aria-expanded="false" aria-controls="job_list___sub_collapse_907_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_907_1"><button class="btn btn-outline-danger"><span class="job_id">907 : Job ID d141bfdcb0ca4bfa8bad7b4f06a88663</span></button></div></a><div aria-labelledby="job_list___sub_heading_907_1" data-parent="#job_list___sub_accordion_907" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_907_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1229" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1229, 82), end pos: (1229, 85)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 223</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1226,7 +1226,7 @@ app.logger.error( "Error when attempting to read watermark for document %s: %s", doc_id, e ) - return jsonify({"error": "error when attempting to read watermark"}), 400 + return jsonify({"error": "error when attempting to read watermark"}), 399 inc_watermark_read(method) return jsonify( {</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.32s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_908"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_908_1" aria-expanded="false" aria-controls="job_list___sub_collapse_908_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_908_1"><button class="btn btn-outline-success"><span class="job_id">908 : Job ID 16b78df137434ce3802a262e4e0433b3</span></button></div></a><div aria-labelledby="job_list___sub_heading_908_1" data-parent="#job_list___sub_accordion_908" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_908_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1238" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1238, 11), end pos: (1238, 14)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 224</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1235,7 +1235,7 @@ "method": method, "position": position, } - ), 201 + ), 202 def _is_authorized_metrics_request() -&gt; bool: token_required = os.environ.get("METRICS_TOKEN", "")</pre></div><div class="alert alert-secondary"><pre class="diff">..........F... [100%] ================================== FAILURES =================================== __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 202 == 201 E + where 202 = &lt;WrapperTestResponse 105 bytes [202 ACCEPTED]&gt;.status_code ..\test\test_api.py:400: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_read_watermark_route - assert 202 == 201 1 failed, 13 passed, 22 warnings in 20.47s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_909"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_909_1" aria-expanded="false" aria-controls="job_list___sub_collapse_909_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_909_1"><button class="btn btn-outline-success"><span class="job_id">909 : Job ID 979d4dbb1f804e198c71ab7bb7e133d7</span></button></div></a><div aria-labelledby="job_list___sub_heading_909_1" data-parent="#job_list___sub_accordion_909" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_909_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1238" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1238, 11), end pos: (1238, 14)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 225</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1235,7 +1235,7 @@ "method": method, "position": position, } - ), 201 + ), 200 def _is_authorized_metrics_request() -&gt; bool: token_required = os.environ.get("METRICS_TOKEN", "")</pre></div><div class="alert alert-secondary"><pre class="diff">...F......F... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:228: in open request = self._request_from_builder_args(args, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:200: in _request_from_builder_args return builder.get_request() ^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:764: in get_request return cls(self.get_environ()) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:688: in get_environ input_stream, content_length, boundary = stream_encode_multipart( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:130: in stream_encode_multipart write_binary(encoder.send_event(Data(data=chunk, more_data=True))) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:81: in write_binary return stream.write(s) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 200 == 201 E + where 200 = &lt;WrapperTestResponse 105 bytes [200 OK]&gt;.status_code ..\test\test_api.py:400: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_read_watermark_route - assert 200 == 201 2 failed, 12 passed, 22 warnings in 20.32s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_910"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_910_1" aria-expanded="false" aria-controls="job_list___sub_collapse_910_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_910_1"><button class="btn btn-outline-danger"><span class="job_id">910 : Job ID 8911f30d363e4c3f9a3cd9e076fe9ed0</span></button></div></a><div aria-labelledby="job_list___sub_heading_910_1" data-parent="#job_list___sub_accordion_910" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_910_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1254" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1254, 52), end pos: (1254, 55)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 226</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1251,7 +1251,7 @@ app.logger.warning( "Unauthorized metrics access attempt from %s", request.remote_addr ) - return jsonify({"error": "not found"}), 404 + return jsonify({"error": "not found"}), 405 data = render_prometheus() return Response(data, mimetype="text/plain; version=0.0.4") </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.97s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_911"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_911_1" aria-expanded="false" aria-controls="job_list___sub_collapse_911_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_911_1"><button class="btn btn-outline-danger"><span class="job_id">911 : Job ID 6c90181cccf24bf19957704618a218b6</span></button></div></a><div aria-labelledby="job_list___sub_heading_911_1" data-parent="#job_list___sub_accordion_911" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_911_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1254" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1254, 52), end pos: (1254, 55)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 227</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1251,7 +1251,7 @@ app.logger.warning( "Unauthorized metrics access attempt from %s", request.remote_addr ) - return jsonify({"error": "not found"}), 404 + return jsonify({"error": "not found"}), 403 data = render_prometheus() return Response(data, mimetype="text/plain; version=0.0.4") </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.93s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_912"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_912_1" aria-expanded="false" aria-controls="job_list___sub_collapse_912_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_912_1"><button class="btn btn-outline-success"><span class="job_id">912 : Job ID 4e1fd6768e044cfba3de34efe2038fcc</span></button></div></a><div aria-labelledby="job_list___sub_heading_912_1" data-parent="#job_list___sub_accordion_912" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_912_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1265" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1265, 38), end pos: (1265, 42)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 228</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1262,7 +1262,7 @@ app = create_app() if __name__ == "__main__": - port = int(os.environ.get("PORT", 5000)) + port = int(os.environ.get("PORT", 5001)) # Use localhost by default for security, allow override via environment variable host = os.environ.get("HOST", "127.0.0.1") app.run(host=host, port=port)</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e21f6c510616c5d97: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.69s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_913"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_913_1" aria-expanded="false" aria-controls="job_list___sub_collapse_913_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_913_1"><button class="btn btn-outline-success"><span class="job_id">913 : Job ID 221d6e8e1f6e42a89df6b79370dabc71</span></button></div></a><div aria-labelledby="job_list___sub_heading_913_1" data-parent="#job_list___sub_accordion_913" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_913_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1265" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1265, 38), end pos: (1265, 42)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 229</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1262,7 +1262,7 @@ app = create_app() if __name__ == "__main__": - port = int(os.environ.get("PORT", 5000)) + port = int(os.environ.get("PORT", 4999)) # Use localhost by default for security, allow override via environment variable host = os.environ.get("HOST", "127.0.0.1") app.run(host=host, port=port)</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ece8c3631c207ab58: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.69s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_914"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_914_1" aria-expanded="false" aria-controls="job_list___sub_collapse_914_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_914_1"><button class="btn btn-outline-success"><span class="job_id">914 : Job ID 1c6154f3b69841fda733e79dd8ad9d75</span></button></div></a><div aria-labelledby="job_list___sub_heading_914_1" data-parent="#job_list___sub_accordion_914" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_914_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=99" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (99, 8), end pos: (100, 0)</button></a></pre><pre>operator: core/RemoveDecorator, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -96,7 +96,6 @@ return jsonify({"error": msg}), code def require_auth(f): - @wraps(f) def wrapper(*args, **kwargs): if app.config['TESTING']: g.user = {"id": 1, "login": "username", "email": "user@email.se"}</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:1261: in &lt;module&gt; app = create_app() ^^^^^^^^^^^^ server.py:414: in create_app @app.get("/api/list-documents") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\sansio\scaffold.py:362: in decorator self.add_url_rule(rule, endpoint, f, **options) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\sansio\scaffold.py:47: in wrapper_func return f(self, *args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\sansio\app.py:657: in add_url_rule raise AssertionError( E AssertionError: View function mapping is overwriting an existing endpoint function: wrapper ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-17T07:58:48+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T07:58:48+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_db-data Removing Volume softsec-tatou_user-files Removing Volume softsec-tatou_grafana-data Removing Network softsec-tatou_default Removing Volume softsec-tatou_db-data Removed Volume softsec-tatou_grafana-data Resource is still in use Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removed time="2025-10-17T07:58:50+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T07:58:50+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - AssertionError: View function mapping is overwrit... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 8 warnings, 1 error in 13.26s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_915"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_915_1" aria-expanded="false" aria-controls="job_list___sub_collapse_915_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_915_1"><button class="btn btn-outline-danger"><span class="job_id">915 : Job ID 1839693ca0c0450292a000fcea61aa10</span></button></div></a><div aria-labelledby="job_list___sub_heading_915_1" data-parent="#job_list___sub_accordion_915" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_915_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=135" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (135, 4), end pos: (136, 0)</button></a></pre><pre>operator: core/RemoveDecorator, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -130,9 +130,6 @@ for chunk in iter(lambda: f.read(1024 * 1024), b""): h.update(chunk) return h.hexdigest() - - # --- Request instrumentation hooks --- - @app.before_request # type: ignore def _tatou_before(): try: # record start for latency request._tatou_start = time.time() # type: ignore[attr-defined]</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.24s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_916"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_916_1" aria-expanded="false" aria-controls="job_list___sub_collapse_916_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_916_1"><button class="btn btn-outline-danger"><span class="job_id">916 : Job ID 7fef76ee5d9c42b7bd130583f1a662bf</span></button></div></a><div aria-labelledby="job_list___sub_heading_916_1" data-parent="#job_list___sub_accordion_916" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_916_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=151" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (151, 4), end pos: (152, 0)</button></a></pre><pre>operator: core/RemoveDecorator, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -147,8 +147,6 @@ app.logger.warning("Request size capture failed: %s", exc) except Exception as exc: # pragma: no cover - defensive app.logger.warning("before_request instrumentation failed: %s", exc) - - @app.after_request # type: ignore def _tatou_after(resp): try: start = getattr(request, "_tatou_start", None)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.14s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_917"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_917_1" aria-expanded="false" aria-controls="job_list___sub_collapse_917_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_917_1"><button class="btn btn-outline-danger"><span class="job_id">917 : Job ID 1ccf5ee1e8214f4f8a6223f718659f14</span></button></div></a><div aria-labelledby="job_list___sub_heading_917_1" data-parent="#job_list___sub_accordion_917" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_917_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=165" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (165, 4), end pos: (166, 0)</button></a></pre><pre>operator: core/RemoveDecorator, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -159,10 +159,6 @@ except Exception as exc: # pragma: no cover - defensive app.logger.warning("after_request instrumentation failed: %s", exc) return resp - - # --- Routes --- - - @app.route("/&lt;path:filename&gt;") def static_files(filename): return app.send_static_file(filename) </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.08s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_918"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_918_1" aria-expanded="false" aria-controls="job_list___sub_collapse_918_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_918_1"><button class="btn btn-outline-danger"><span class="job_id">918 : Job ID 4ffa687fae5a4f35a0581f52ff7bc63a</span></button></div></a><div aria-labelledby="job_list___sub_heading_918_1" data-parent="#job_list___sub_accordion_918" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_918_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=169" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (169, 4), end pos: (170, 0)</button></a></pre><pre>operator: core/RemoveDecorator, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -165,8 +165,6 @@ @app.route("/&lt;path:filename&gt;") def static_files(filename): return app.send_static_file(filename) - - @app.route("/") def home(): return app.send_static_file("index.html") </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.15s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_919"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_919_1" aria-expanded="false" aria-controls="job_list___sub_collapse_919_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_919_1"><button class="btn btn-outline-success"><span class="job_id">919 : Job ID 7b6a1063e76d49a782d7fc1941ad1d49</span></button></div></a><div aria-labelledby="job_list___sub_heading_919_1" data-parent="#job_list___sub_accordion_919" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_919_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=173" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (173, 4), end pos: (174, 0)</button></a></pre><pre>operator: core/RemoveDecorator, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -169,8 +169,6 @@ @app.route("/") def home(): return app.send_static_file("index.html") - - @app.get("/healthz") def healthz(): try: with get_engine().connect() as conn:</pre></div><div class="alert alert-secondary"><pre class="diff">F..F.....FFF.F [100%] ================================== FAILURES =================================== _____________________________ test_healthz_route ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_healthz_route(client): """Test the health check endpoint.""" resp = client.get("/healthz") &gt; assert resp.status_code == 200 # nosec B101 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:56: AssertionError _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:299: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:301 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1054 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:355 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:848 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e82182c29622f9083: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_healthz_route - assert 404 == 200 FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 6 failed, 8 passed, 22 warnings in 19.84s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_920"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_920_1" aria-expanded="false" aria-controls="job_list___sub_collapse_920_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_920_1"><button class="btn btn-outline-success"><span class="job_id">920 : Job ID 2d80d9b706ea47ac9a7744dc468a748c</span></button></div></a><div aria-labelledby="job_list___sub_heading_920_1" data-parent="#job_list___sub_accordion_920" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_920_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=197" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (197, 4), end pos: (198, 0)</button></a></pre><pre>operator: core/RemoveDecorator, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -192,9 +192,6 @@ if not re.match(r"^[a-zA-Z0-9_-]{3,64}$", login): return False, "Invalid login format" return True, "" - - # POST /api/create-user {email, login, password} - @app.post("/api/create-user") def create_user(): payload = request.get_json(silent=True) or {} email = (payload.get("email") or "").strip().lower()</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 405 == 201 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:73: AssertionError ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:269 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:390 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T003013954623Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:483 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:607 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:969 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:390 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T003014934724Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:847 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:245 Failed to add source PDF to database: No users exist to own RMAP base document; create a user first ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 405 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 9 failed, 5 passed, 22 warnings in 19.06s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_921"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_921_1" aria-expanded="false" aria-controls="job_list___sub_collapse_921_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_921_1"><button class="btn btn-outline-success"><span class="job_id">921 : Job ID 0749451c7d994b87b2ca8a8b9ad7ade1</span></button></div></a><div aria-labelledby="job_list___sub_heading_921_1" data-parent="#job_list___sub_accordion_921" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_921_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=242" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (242, 4), end pos: (243, 0)</button></a></pre><pre>operator: core/RemoveDecorator, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -237,9 +237,6 @@ return jsonify({"error": "database error"}), 503 return jsonify({"id": row.id, "email": row.email, "login": row.login}), 201 - - # POST /api/login {login, password} - @app.post("/api/login") def login(): payload = request.get_json(silent=True) or {} email = (payload.get("email") or "").strip()</pre></div><div class="alert alert-secondary"><pre class="diff">..F........... [100%] ================================== FAILURES =================================== ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:117: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_login_route - assert 405 == 200 1 failed, 13 passed, 22 warnings in 20.17s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_922"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_922_1" aria-expanded="false" aria-controls="job_list___sub_collapse_922_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_922_1"><button class="btn btn-outline-success"><span class="job_id">922 : Job ID f8002894e52944a2a28dc9b30ba5ab0e</span></button></div></a><div aria-labelledby="job_list___sub_heading_922_1" data-parent="#job_list___sub_accordion_922" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_922_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=298" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (298, 4), end pos: (299, 0)</button></a></pre><pre>operator: core/RemoveDecorator, occurrence: 8</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -293,9 +293,6 @@ "expires_in": app.config["TOKEN_TTL_SECONDS"], } ), 200 - - # POST /api/upload-document (multipart/form-data) - @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 405 == 201 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:152: AssertionError __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:429 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:501 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:548 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:597 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:965 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 405 == 201 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:389: AssertionError _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:841 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ERROR server:rmap_handler.py:245 Failed to add source PDF to database: No users exist to own RMAP base document; create a user first ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 405 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 405 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 11 failed, 3 passed, 22 warnings in 19.58s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_923"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_923_1" aria-expanded="false" aria-controls="job_list___sub_collapse_923_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_923_1"><button class="btn btn-outline-success"><span class="job_id">923 : Job ID d41d4e6df99748538ec96f1d1b067772</span></button></div></a><div aria-labelledby="job_list___sub_heading_923_1" data-parent="#job_list___sub_accordion_923" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_923_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=299" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (299, 4), end pos: (300, 0)</button></a></pre><pre>operator: core/RemoveDecorator, occurrence: 9</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -296,7 +296,6 @@ # POST /api/upload-document (multipart/form-data) @app.post("/api/upload-document") - @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field")</pre></div><div class="alert alert-secondary"><pre class="diff">...F.F.F.FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } &gt; resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:147: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:340: in upload_document user_dir = app.config["STORAGE_DIR"] / "files" / g.user["login"] ^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = &lt;flask.ctx._AppCtxGlobals object at 0x000001FAC2989580&gt;, name = 'user' def __getattr__(self, name: str) -&gt; t.Any: try: return self.__dict__[name] except KeyError: &gt; raise AttributeError(name) from None E AttributeError: user C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\ctx.py:56: AttributeError __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:485 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:609 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:971 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } &gt; upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:387: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:340: in upload_document user_dir = app.config["STORAGE_DIR"] / "files" / g.user["login"] ^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = &lt;flask.ctx._AppCtxGlobals object at 0x000001FAC2998FB0&gt;, name = 'user' def __getattr__(self, name: str) -&gt; t.Any: try: return self.__dict__[name] except KeyError: &gt; raise AttributeError(name) from None E AttributeError: user C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\ctx.py:56: AttributeError _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:849 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - AttributeError: user FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - AttributeError: user FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 6 failed, 8 passed, 22 warnings in 19.33s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_924"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_924_1" aria-expanded="false" aria-controls="job_list___sub_collapse_924_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_924_1"><button class="btn btn-outline-success"><span class="job_id">924 : Job ID d25d52edffcf4470870cc4deb9b9fc0f</span></button></div></a><div aria-labelledby="job_list___sub_heading_924_1" data-parent="#job_list___sub_accordion_924" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_924_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=415" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (415, 4), end pos: (416, 0)</button></a></pre><pre>operator: core/RemoveDecorator, occurrence: 10</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -410,9 +410,6 @@ } inc_upload(int(row.size)) return jsonify(resp_data), 201 - - # GET /api/list-documents - @app.get("/api/list-documents") @require_auth def list_documents(): try:</pre></div><div class="alert alert-secondary"><pre class="diff">....F......... [100%] ================================== FAILURES =================================== __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:198: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_list_documents_route - assert 404 == 200 1 failed, 13 passed, 22 warnings in 21.36s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_925"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_925_1" aria-expanded="false" aria-controls="job_list___sub_collapse_925_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_925_1"><button class="btn btn-outline-success"><span class="job_id">925 : Job ID 0f65afaeaf4c47de9c36a837a2b6353e</span></button></div></a><div aria-labelledby="job_list___sub_heading_925_1" data-parent="#job_list___sub_accordion_925" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_925_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=416" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (416, 4), end pos: (417, 0)</button></a></pre><pre>operator: core/RemoveDecorator, occurrence: 11</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -413,7 +413,6 @@ # GET /api/list-documents @app.get("/api/list-documents") - @require_auth def list_documents(): try: with get_engine().connect() as conn:</pre></div><div class="alert alert-secondary"><pre class="diff">....F......... [100%] ================================== FAILURES =================================== __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" &gt; resp = client.get("/api/list-documents") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:194: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1162: in get return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:432: in list_documents "Database error in list_documents for user=%s", g.user["id"] ^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = &lt;flask.ctx._AppCtxGlobals object at 0x000001C00AA9E630&gt;, name = 'user' def __getattr__(self, name: str) -&gt; t.Any: try: return self.__dict__[name] except KeyError: &gt; raise AttributeError(name) from None E AttributeError: user C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\ctx.py:56: AttributeError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_list_documents_route - AttributeError: user 1 failed, 13 passed, 22 warnings in 20.61s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_926"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_926_1" aria-expanded="false" aria-controls="job_list___sub_collapse_926_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_926_1"><button class="btn btn-outline-success"><span class="job_id">926 : Job ID b064a02669894767a1391baeaa10d8b0</span></button></div></a><div aria-labelledby="job_list___sub_heading_926_1" data-parent="#job_list___sub_accordion_926" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_926_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=453" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (453, 4), end pos: (454, 0)</button></a></pre><pre>operator: core/RemoveDecorator, occurrence: 12</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -448,9 +448,6 @@ for r in rows ] return jsonify({"documents": docs}), 200 - - # GET /api/list-versions - @app.get("/api/list-versions") @app.get("/api/list-versions/&lt;int:document_id&gt;") @require_auth def list_versions(document_id: int | None = None):</pre></div><div class="alert alert-secondary"><pre class="diff">.....F........ [100%] ================================== FAILURES =================================== __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 1 failed, 13 passed, 22 warnings in 22.55s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_927"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_927_1" aria-expanded="false" aria-controls="job_list___sub_collapse_927_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_927_1"><button class="btn btn-outline-danger"><span class="job_id">927 : Job ID cd7134124f01419a8f3e44c51ec11952</span></button></div></a><div aria-labelledby="job_list___sub_heading_927_1" data-parent="#job_list___sub_accordion_927" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_927_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=454" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (454, 4), end pos: (455, 0)</button></a></pre><pre>operator: core/RemoveDecorator, occurrence: 13</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -451,7 +451,6 @@ # GET /api/list-versions @app.get("/api/list-versions") - @app.get("/api/list-versions/&lt;int:document_id&gt;") @require_auth def list_versions(document_id: int | None = None): # Input validation</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.25s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_928"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_928_1" aria-expanded="false" aria-controls="job_list___sub_collapse_928_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_928_1"><button class="btn btn-outline-success"><span class="job_id">928 : Job ID b19603f8bf6b4b889d3f6cccd46251cb</span></button></div></a><div aria-labelledby="job_list___sub_heading_928_1" data-parent="#job_list___sub_accordion_928" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_928_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=455" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (455, 4), end pos: (456, 0)</button></a></pre><pre>operator: core/RemoveDecorator, occurrence: 14</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -452,7 +452,6 @@ # GET /api/list-versions @app.get("/api/list-versions") @app.get("/api/list-versions/&lt;int:document_id&gt;") - @require_auth def list_versions(document_id: int | None = None): # Input validation if document_id is None:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T052054079843Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} &gt; resp = client.get("/api/list-versions", query_string = parameters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:215: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1162: in get return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:504: in list_versions f"Database error in list_versions: {document_id},{g.user['id']}" ^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = &lt;flask.ctx._AppCtxGlobals object at 0x0000011D5BC56870&gt;, name = 'user' def __getattr__(self, name: str) -&gt; t.Any: try: return self.__dict__[name] except KeyError: &gt; raise AttributeError(name) from None E AttributeError: user C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\ctx.py:56: AttributeError ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:550 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:599 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:967 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T052055038467Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:843 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - AttributeError: user FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.43s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_929"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_929_1" aria-expanded="false" aria-controls="job_list___sub_collapse_929_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_929_1"><button class="btn btn-outline-success"><span class="job_id">929 : Job ID e42917798eab485b92940f54747ee5c1</span></button></div></a><div aria-labelledby="job_list___sub_heading_929_1" data-parent="#job_list___sub_accordion_929" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_929_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=524" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (524, 4), end pos: (525, 0)</button></a></pre><pre>operator: core/RemoveDecorator, occurrence: 15</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -519,9 +519,6 @@ for r in rows ] return jsonify({"versions": versions}), 200 - - # GET /api/list-all-versions - @app.get("/api/list-all-versions") @require_auth def list_all_versions(): try:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T152008687031Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:255: AssertionError ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:597 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:965 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T152009526192Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:841 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.39s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_930"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_930_1" aria-expanded="false" aria-controls="job_list___sub_collapse_930_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_930_1"><button class="btn btn-outline-success"><span class="job_id">930 : Job ID 92e0669013fb43cb90c2487889a071d7</span></button></div></a><div aria-labelledby="job_list___sub_heading_930_1" data-parent="#job_list___sub_accordion_930" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_930_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=525" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (525, 4), end pos: (526, 0)</button></a></pre><pre>operator: core/RemoveDecorator, occurrence: 16</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -522,7 +522,6 @@ # GET /api/list-all-versions @app.get("/api/list-all-versions") - @require_auth def list_all_versions(): try: # Validate user data from auth token</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.FFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T165953442229Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters &gt; resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:251: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1162: in get return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:551: in list_all_versions "Database error in list_all_versions for user=%s", g.user["id"] ^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = &lt;flask.ctx._AppCtxGlobals object at 0x000001FF5217BA10&gt;, name = 'user' def __getattr__(self, name: str) -&gt; t.Any: try: return self.__dict__[name] except KeyError: &gt; raise AttributeError(name) from None E AttributeError: user C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\ctx.py:56: AttributeError ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:609 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:971 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T165954469526Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:849 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - AttributeError: user FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.53s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_931"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_931_1" aria-expanded="false" aria-controls="job_list___sub_collapse_931_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_931_1"><button class="btn btn-outline-success"><span class="job_id">931 : Job ID ed22c76c95744bbeb384d1a2e635397b</span></button></div></a><div aria-labelledby="job_list___sub_heading_931_1" data-parent="#job_list___sub_accordion_931" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_931_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=570" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (570, 4), end pos: (571, 0)</button></a></pre><pre>operator: core/RemoveDecorator, occurrence: 17</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -565,9 +565,6 @@ for r in rows ] return jsonify({"versions": versions}), 200 - - # GET /api/get-document or /api/get-document/&lt;id&gt;  returns the PDF (inline) - @app.get("/api/get-document") @app.get("/api/get-document/&lt;int:document_id&gt;") @require_auth def get_document(document_id: int | None = None):</pre></div><div class="alert alert-secondary"><pre class="diff">.......F...... [100%] ================================== FAILURES =================================== ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_get_document_route - assert False 1 failed, 13 passed, 22 warnings in 21.66s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_932"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_932_1" aria-expanded="false" aria-controls="job_list___sub_collapse_932_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_932_1"><button class="btn btn-outline-success"><span class="job_id">932 : Job ID 171d522562f74af98d088afffed831a2</span></button></div></a><div aria-labelledby="job_list___sub_heading_932_1" data-parent="#job_list___sub_accordion_932" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_932_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=571" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (571, 4), end pos: (572, 0)</button></a></pre><pre>operator: core/RemoveDecorator, occurrence: 18</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -568,7 +568,6 @@ # GET /api/get-document or /api/get-document/&lt;id&gt;  returns the PDF (inline) @app.get("/api/get-document") - @app.get("/api/get-document/&lt;int:document_id&gt;") @require_auth def get_document(document_id: int | None = None): # Support both path param and ?id=/ ?documentid=</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1055 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:849 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e1ca1990627d9c814: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.75s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_933"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_933_1" aria-expanded="false" aria-controls="job_list___sub_collapse_933_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_933_1"><button class="btn btn-outline-success"><span class="job_id">933 : Job ID 30e3d92814964db39b2feeb986ac251f</span></button></div></a><div aria-labelledby="job_list___sub_heading_933_1" data-parent="#job_list___sub_accordion_933" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_933_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=572" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (572, 4), end pos: (573, 0)</button></a></pre><pre>operator: core/RemoveDecorator, occurrence: 19</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -569,7 +569,6 @@ # GET /api/get-document or /api/get-document/&lt;id&gt;  returns the PDF (inline) @app.get("/api/get-document") @app.get("/api/get-document/&lt;int:document_id&gt;") - @require_auth def get_document(document_id: int | None = None): # Support both path param and ?id=/ ?documentid= if document_id is None:</pre></div><div class="alert alert-secondary"><pre class="diff">.......F...F.. [100%] ================================== FAILURES =================================== ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} &gt; resp = client.get("/api/get-document", query_string=parameters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:273: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1162: in get return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:600: in get_document f"Database error in get_document: {document_id},{g.user['id']}" ^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = &lt;flask.ctx._AppCtxGlobals object at 0x000001B415291460&gt;, name = 'user' def __getattr__(self, name: str) -&gt; t.Any: try: return self.__dict__[name] except KeyError: &gt; raise AttributeError(name) from None E AttributeError: user C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\ctx.py:56: AttributeError _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") assert resp.status_code == 200 #Test file is deleted &gt; resp_deletion = client.get("/api/get-document/2") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:445: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1162: in get return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:600: in get_document f"Database error in get_document: {document_id},{g.user['id']}" ^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = &lt;flask.ctx._AppCtxGlobals object at 0x000001B41561BE90&gt;, name = 'user' def __getattr__(self, name: str) -&gt; t.Any: try: return self.__dict__[name] except KeyError: &gt; raise AttributeError(name) from None E AttributeError: user C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\ctx.py:56: AttributeError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_get_document_route - AttributeError: user FAILED ..\test\test_api.py::test_delete_document_route - AttributeError: user 2 failed, 12 passed, 22 warnings in 21.21s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_934"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_934_1" aria-expanded="false" aria-controls="job_list___sub_collapse_934_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_934_1"><button class="btn btn-outline-danger"><span class="job_id">934 : Job ID 26ca6ea6b4ce4d9791b00253aa0bf31e</span></button></div></a><div aria-labelledby="job_list___sub_heading_934_1" data-parent="#job_list___sub_accordion_934" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_934_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=693" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (693, 4), end pos: (694, 0)</button></a></pre><pre>operator: core/RemoveDecorator, occurrence: 20</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -688,9 +688,6 @@ "Error serving file for document id=%s: %s", document_id, e ) return jsonify({"error": "error serving file"}), 500 - - # GET /api/get-version/&lt;link&gt;  returns the watermarked PDF (inline) - @app.get("/api/get-version/&lt;link&gt;") def get_version(link: str): # Accept both 32-char (RMAP session secrets) and 64-char (SHA-256 style) tokens if not re.fullmatch(r"[0-9a-f]{32}|[0-9a-f]{64}", link):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.00s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_935"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_935_1" aria-expanded="false" aria-controls="job_list___sub_collapse_935_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_935_1"><button class="btn btn-outline-success"><span class="job_id">935 : Job ID 8b5b5a8c87604e23b51dffd15e655957</span></button></div></a><div aria-labelledby="job_list___sub_heading_935_1" data-parent="#job_list___sub_accordion_935" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_935_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=801" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (801, 4), end pos: (802, 0)</button></a></pre><pre>operator: core/RemoveDecorator, occurrence: 21</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -796,9 +796,6 @@ f"path {fp} escapes storage root {storage_root}" ) from None return fp - - # DELETE /api/delete-document (and variants) POST supported for convenience - @app.route("/api/delete-document", methods=["DELETE", "POST"]) @app.route("/api/delete-document/&lt;document_id&gt;", methods=["DELETE"]) @require_auth def delete_document(document_id: int | None = None):</pre></div><div class="alert alert-secondary"><pre class="diff">...........F.. [100%] ================================== FAILURES =================================== _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:443: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_delete_document_route - assert 405 == 200 1 failed, 13 passed, 22 warnings in 20.78s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_936"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_936_1" aria-expanded="false" aria-controls="job_list___sub_collapse_936_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_936_1"><button class="btn btn-outline-danger"><span class="job_id">936 : Job ID a3bda5b05ac64b4eacb78f349bebfe95</span></button></div></a><div aria-labelledby="job_list___sub_heading_936_1" data-parent="#job_list___sub_accordion_936" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_936_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=802" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (802, 4), end pos: (803, 0)</button></a></pre><pre>operator: core/RemoveDecorator, occurrence: 22</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -799,7 +799,6 @@ # DELETE /api/delete-document (and variants) POST supported for convenience @app.route("/api/delete-document", methods=["DELETE", "POST"]) - @app.route("/api/delete-document/&lt;document_id&gt;", methods=["DELETE"]) @require_auth def delete_document(document_id: int | None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on POST</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.48s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_937"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_937_1" aria-expanded="false" aria-controls="job_list___sub_collapse_937_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_937_1"><button class="btn btn-outline-success"><span class="job_id">937 : Job ID 55f2964e81be4a7eb5ddda4eea19128b</span></button></div></a><div aria-labelledby="job_list___sub_heading_937_1" data-parent="#job_list___sub_accordion_937" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_937_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=803" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (803, 4), end pos: (804, 0)</button></a></pre><pre>operator: core/RemoveDecorator, occurrence: 23</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -800,7 +800,6 @@ # DELETE /api/delete-document (and variants) POST supported for convenience @app.route("/api/delete-document", methods=["DELETE", "POST"]) @app.route("/api/delete-document/&lt;document_id&gt;", methods=["DELETE"]) - @require_auth def delete_document(document_id: int | None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on POST if document_id in (None, ""):</pre></div><div class="alert alert-secondary"><pre class="diff">...........F.. [100%] ================================== FAILURES =================================== _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} &gt; resp = client.delete("/api/delete-document", json=document_id) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:440: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1177: in delete return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:826: in delete_document owner_id = int(g.user["id"]) ^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = &lt;flask.ctx._AppCtxGlobals object at 0x00000208EE645F70&gt;, name = 'user' def __getattr__(self, name: str) -&gt; t.Any: try: return self.__dict__[name] except KeyError: &gt; raise AttributeError(name) from None E AttributeError: user C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\ctx.py:56: AttributeError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_delete_document_route - AttributeError: user 1 failed, 13 passed, 22 warnings in 20.32s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_938"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_938_1" aria-expanded="false" aria-controls="job_list___sub_collapse_938_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_938_1"><button class="btn btn-outline-success"><span class="job_id">938 : Job ID 207b8156f483439dbb96a25aa1e89b60</span></button></div></a><div aria-labelledby="job_list___sub_heading_938_1" data-parent="#job_list___sub_accordion_938" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_938_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=906" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (906, 4), end pos: (907, 0)</button></a></pre><pre>operator: core/RemoveDecorator, occurrence: 24</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -900,10 +900,6 @@ "note": delete_error, # null/omitted if everything was fine } ), 200 - - # POST /api/create-watermark or /api/create-watermark/&lt;id&gt; - #  create watermarked pdf and returns metadata - @app.post("/api/create-watermark") @app.post("/api/create-watermark/&lt;int:document_id&gt;") @require_auth def create_watermark(document_id: int | None = None):</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 405 == 201 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:322: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 405 == 201 1 failed, 13 passed, 22 warnings in 20.23s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_939"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_939_1" aria-expanded="false" aria-controls="job_list___sub_collapse_939_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_939_1"><button class="btn btn-outline-danger"><span class="job_id">939 : Job ID b329a83972444b89a262c2c20dbb3af5</span></button></div></a><div aria-labelledby="job_list___sub_heading_939_1" data-parent="#job_list___sub_accordion_939" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_939_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=907" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (907, 4), end pos: (908, 0)</button></a></pre><pre>operator: core/RemoveDecorator, occurrence: 25</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -904,7 +904,6 @@ # POST /api/create-watermark or /api/create-watermark/&lt;id&gt; #  create watermarked pdf and returns metadata @app.post("/api/create-watermark") - @app.post("/api/create-watermark/&lt;int:document_id&gt;") @require_auth def create_watermark(document_id: int | None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on GET</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.25s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_940"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_940_1" aria-expanded="false" aria-controls="job_list___sub_collapse_940_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_940_1"><button class="btn btn-outline-success"><span class="job_id">940 : Job ID 2965e2cfc2f74f738827a77942fff6a5</span></button></div></a><div aria-labelledby="job_list___sub_heading_940_1" data-parent="#job_list___sub_accordion_940" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_940_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=908" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (908, 4), end pos: (909, 0)</button></a></pre><pre>operator: core/RemoveDecorator, occurrence: 26</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -905,7 +905,6 @@ #  create watermarked pdf and returns metadata @app.post("/api/create-watermark") @app.post("/api/create-watermark/&lt;int:document_id&gt;") - @require_auth def create_watermark(document_id: int | None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on GET if not document_id:</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:967 Database error fetching document user ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 1 failed, 13 passed, 22 warnings in 20.12s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_941"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_941_1" aria-expanded="false" aria-controls="job_list___sub_collapse_941_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_941_1"><button class="btn btn-outline-success"><span class="job_id">941 : Job ID 59dc5e2abeb349c9ac845d776061345a</span></button></div></a><div aria-labelledby="job_list___sub_heading_941_1" data-parent="#job_list___sub_accordion_941" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_941_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1131" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1131, 4), end pos: (1132, 0)</button></a></pre><pre>operator: core/RemoveDecorator, occurrence: 27</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1125,10 +1125,6 @@ "size": len(wm_bytes), } ), 201 - - # GET /api/get-watermarking-methods - #  {"methods":[{"name":..., "description":...}, ...], "count":N} - @app.get("/api/get-watermarking-methods") def get_watermarking_methods(): methods = [] </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFFFFFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T012418500445Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _____________________ test_get_watermarking_methods_route _____________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_watermarking_methods_route(client): """Test get watermarking methods endpoint.""" resp = client.get("/api/get-watermarking-methods") data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:301: AssertionError _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T012419416248Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_get_watermarking_methods_route - assert 404 ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 11 failed, 3 passed, 22 warnings in 19.30s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_942"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_942_1" aria-expanded="false" aria-controls="job_list___sub_collapse_942_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_942_1"><button class="btn btn-outline-success"><span class="job_id">942 : Job ID b1aad30e34a943e191830ce71291aa2a</span></button></div></a><div aria-labelledby="job_list___sub_heading_942_1" data-parent="#job_list___sub_accordion_942" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_942_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1143" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1143, 4), end pos: (1144, 0)</button></a></pre><pre>operator: core/RemoveDecorator, occurrence: 28</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1138,9 +1138,6 @@ ) return jsonify({"methods": methods, "count": len(methods)}), 200 - - # POST /api/read-watermark - @app.post("/api/read-watermark") @app.post("/api/read-watermark/&lt;int:document_id&gt;") @require_auth def read_watermark(document_id: int | None = None):</pre></div><div class="alert alert-secondary"><pre class="diff">..........F... [100%] ================================== FAILURES =================================== __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 405 == 201 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:400: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_read_watermark_route - assert 405 == 201 1 failed, 13 passed, 22 warnings in 19.83s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_943"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_943_1" aria-expanded="false" aria-controls="job_list___sub_collapse_943_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_943_1"><button class="btn btn-outline-danger"><span class="job_id">943 : Job ID 012ae3deb1454460acecece685f2dd32</span></button></div></a><div aria-labelledby="job_list___sub_heading_943_1" data-parent="#job_list___sub_accordion_943" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_943_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1144" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1144, 4), end pos: (1145, 0)</button></a></pre><pre>operator: core/RemoveDecorator, occurrence: 29</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1141,7 +1141,6 @@ # POST /api/read-watermark @app.post("/api/read-watermark") - @app.post("/api/read-watermark/&lt;int:document_id&gt;") @require_auth def read_watermark(document_id: int | None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on POST</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.37s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_944"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_944_1" aria-expanded="false" aria-controls="job_list___sub_collapse_944_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_944_1"><button class="btn btn-outline-success"><span class="job_id">944 : Job ID 356665b1c65446458ea62551c133b644</span></button></div></a><div aria-labelledby="job_list___sub_heading_944_1" data-parent="#job_list___sub_accordion_944" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_944_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1145" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1145, 4), end pos: (1146, 0)</button></a></pre><pre>operator: core/RemoveDecorator, occurrence: 30</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1142,7 +1142,6 @@ # POST /api/read-watermark @app.post("/api/read-watermark") @app.post("/api/read-watermark/&lt;int:document_id&gt;") - @require_auth def read_watermark(document_id: int | None = None): # accept id from path, query (?id= / ?documentid=), or JSON body on POST if not document_id:</pre></div><div class="alert alert-secondary"><pre class="diff">..........F... [100%] ================================== FAILURES =================================== __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:400: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1195 Database error fetching document 2 for watermark read: user ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 1 failed, 13 passed, 22 warnings in 20.74s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_945"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_945_1" aria-expanded="false" aria-controls="job_list___sub_collapse_945_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_945_1"><button class="btn btn-outline-danger"><span class="job_id">945 : Job ID 178c2b52b33442e68a522eeb630df812</span></button></div></a><div aria-labelledby="job_list___sub_heading_945_1" data-parent="#job_list___sub_accordion_945" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_945_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1247" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1247, 4), end pos: (1248, 0)</button></a></pre><pre>operator: core/RemoveDecorator, occurrence: 31</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1243,8 +1243,6 @@ if provided != token_required: return False return True - - @app.get("/metrics") def metrics(): if not _is_authorized_metrics_request(): # Obscure existence a bit  return 404 instead of 403 to casual scans</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.11s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_946"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_946_1" aria-expanded="false" aria-controls="job_list___sub_collapse_946_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_946_1"><button class="btn btn-outline-danger"><span class="job_id">946 : Job ID 1651fcba46044c8c942a98678f13546c</span></button></div></a><div aria-labelledby="job_list___sub_heading_946_1" data-parent="#job_list___sub_accordion_946" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_946_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=130" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (130, 25), end pos: (130, 63)</button></a></pre><pre>operator: core/ZeroIterationForLoop, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -127,7 +127,7 @@ def _sha256_file(path: Path) -&gt; str: h = hashlib.sha256() with path.open("rb") as f: - for chunk in iter(lambda: f.read(1024 * 1024), b""): + for chunk in []: h.update(chunk) return h.hexdigest() </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.02s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_947"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_947_1" aria-expanded="false" aria-controls="job_list___sub_collapse_947_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_947_1"><button class="btn btn-outline-danger"><span class="job_id">947 : Job ID 7d7b96eba0744f7b9922eda73480c026</span></button></div></a><div aria-labelledby="job_list___sub_heading_947_1" data-parent="#job_list___sub_accordion_947" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_947_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=server.py&amp;line=1135" class="text-secondary"><button class="btn btn-outline-dark">server.py, start pos: (1135, 17), end pos: (1135, 32)</button></a></pre><pre>operator: core/ZeroIterationForLoop, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aserver.py +++ bserver.py @@ -1132,7 +1132,7 @@ def get_watermarking_methods(): methods = [] - for m in WMUtils.METHODS: + for m in []: methods.append( {"name": m, "description": WMUtils.get_method(m).get_usage()} )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 22.87s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_948"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_948_1" aria-expanded="false" aria-controls="job_list___sub_collapse_948_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_948_1"><button class="btn btn-outline-danger"><span class="job_id">948 : Job ID 3f2efd9899ac43b693b789455143007d</span></button></div></a><div aria-labelledby="job_list___sub_heading_948_1" data-parent="#job_list___sub_accordion_948" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_948_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=40" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (40, 53), end pos: (40, 54)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Sub, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -37,7 +37,7 @@ if len(label_values) != len(self.label_names): # defensive raise ValueError("Label cardinality mismatch") key = tuple(label_values) - self.values[key] = self.values.get(key, 0.0) + amount + self.values[key] = self.values.get(key, 0.0) - amount def render(self) -&gt; str: lines = [f"# HELP {self.name} {self.help}", f"# TYPE {self.name} counter"]</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.23s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_949"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_949_1" aria-expanded="false" aria-controls="job_list___sub_collapse_949_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_949_1"><button class="btn btn-outline-danger"><span class="job_id">949 : Job ID 3ab3be7c556142bbaa847d70a36afeb1</span></button></div></a><div aria-labelledby="job_list___sub_heading_949_1" data-parent="#job_list___sub_accordion_949" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_949_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=72" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (72, 75), end pos: (72, 76)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Sub, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -69,7 +69,7 @@ # stored counts are already cumulative (Prometheus expectation). for b in self.buckets: if value &lt;= b: - self.counts[(labels, b)] = self.counts.get((labels, b), 0) + 1 + self.counts[(labels, b)] = self.counts.get((labels, b), 0) - 1 # Always increment +Inf bucket count inf_key = (labels, float("inf")) self.counts[inf_key] = self.counts.get(inf_key, 0) + 1</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.82s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_950"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_950_1" aria-expanded="false" aria-controls="job_list___sub_collapse_950_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_950_1"><button class="btn btn-outline-success"><span class="job_id">950 : Job ID 1e8aaee5399244cb98296482746009f2</span></button></div></a><div aria-labelledby="job_list___sub_heading_950_1" data-parent="#job_list___sub_accordion_950" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_950_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=75" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (75, 59), end pos: (75, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Sub, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -72,7 +72,7 @@ self.counts[(labels, b)] = self.counts.get((labels, b), 0) + 1 # Always increment +Inf bucket count inf_key = (labels, float("inf")) - self.counts[inf_key] = self.counts.get(inf_key, 0) + 1 + self.counts[inf_key] = self.counts.get(inf_key, 0) - 1 self.sums[labels] = self.sums.get(labels, 0.0) + value def render(self) -&gt; str:</pre></div><div class="alert alert-secondary"><pre class="diff">...F.......... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:228: in open request = self._request_from_builder_args(args, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:200: in _request_from_builder_args return builder.get_request() ^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:764: in get_request return cls(self.get_environ()) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:688: in get_environ input_stream, content_length, boundary = stream_encode_multipart( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:130: in stream_encode_multipart write_binary(encoder.send_event(Data(data=chunk, more_data=True))) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:81: in write_binary return stream.write(s) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... 1 failed, 13 passed, 22 warnings in 21.94s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_951"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_951_1" aria-expanded="false" aria-controls="job_list___sub_collapse_951_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_951_1"><button class="btn btn-outline-danger"><span class="job_id">951 : Job ID 06d007e79d54446a987be0e6d5437d1f</span></button></div></a><div aria-labelledby="job_list___sub_heading_951_1" data-parent="#job_list___sub_accordion_951" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_951_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=76" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (76, 55), end pos: (76, 56)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Sub, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -73,7 +73,7 @@ # Always increment +Inf bucket count inf_key = (labels, float("inf")) self.counts[inf_key] = self.counts.get(inf_key, 0) + 1 - self.sums[labels] = self.sums.get(labels, 0.0) + value + self.sums[labels] = self.sums.get(labels, 0.0) - value def render(self) -&gt; str: # Prometheus histogram:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.98s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_952"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_952_1" aria-expanded="false" aria-controls="job_list___sub_collapse_952_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_952_1"><button class="btn btn-outline-danger"><span class="job_id">952 : Job ID bf63ffe222964dddba77bb498cf7f352</span></button></div></a><div aria-labelledby="job_list___sub_heading_952_1" data-parent="#job_list___sub_accordion_952" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_952_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=110" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (110, 15), end pos: (110, 16)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Sub, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -107,7 +107,7 @@ def _quote(v: str) -&gt; str: - return '"' + v.replace('"', '\\"') + '"' + return '"' - v.replace('"', '\\"') + '"' _lock = Lock()</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.23s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_953"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_953_1" aria-expanded="false" aria-controls="job_list___sub_collapse_953_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_953_1"><button class="btn btn-outline-danger"><span class="job_id">953 : Job ID 9ce991b1ebe044d0beec7ba486d765da</span></button></div></a><div aria-labelledby="job_list___sub_heading_953_1" data-parent="#job_list___sub_accordion_953" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_953_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=110" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (110, 39), end pos: (110, 40)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Sub, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -107,7 +107,7 @@ def _quote(v: str) -&gt; str: - return '"' + v.replace('"', '\\"') + '"' + return '"' + v.replace('"', '\\"') - '"' _lock = Lock()</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.67s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_954"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_954_1" aria-expanded="false" aria-controls="job_list___sub_collapse_954_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_954_1"><button class="btn btn-outline-success"><span class="job_id">954 : Job ID 35002b0087ba474bbfd0078a741bc1e1</span></button></div></a><div aria-labelledby="job_list___sub_heading_954_1" data-parent="#job_list___sub_accordion_954" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_954_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=322" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (322, 28), end pos: (322, 29)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Sub, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -319,7 +319,7 @@ def render_prometheus() -&gt; str: parts = [m.render() for m in _ALL] # type: ignore[attr-defined] - return "\n".join(parts) + "\n" + return "\n".join(parts) - "\n" # Convenience timer context manager (not widely used yet, but available)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T045520309391Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T045521232089Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.86s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_955"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_955_1" aria-expanded="false" aria-controls="job_list___sub_collapse_955_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_955_1"><button class="btn btn-outline-danger"><span class="job_id">955 : Job ID 5e863b1cb8e44f57b49b95ee4a3a8301</span></button></div></a><div aria-labelledby="job_list___sub_heading_955_1" data-parent="#job_list___sub_accordion_955" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_955_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=40" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (40, 53), end pos: (40, 54)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Mul, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -37,7 +37,7 @@ if len(label_values) != len(self.label_names): # defensive raise ValueError("Label cardinality mismatch") key = tuple(label_values) - self.values[key] = self.values.get(key, 0.0) + amount + self.values[key] = self.values.get(key, 0.0) * amount def render(self) -&gt; str: lines = [f"# HELP {self.name} {self.help}", f"# TYPE {self.name} counter"]</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.05s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_956"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_956_1" aria-expanded="false" aria-controls="job_list___sub_collapse_956_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_956_1"><button class="btn btn-outline-danger"><span class="job_id">956 : Job ID 6d25ba9fce00450e89e05b54a3024bb7</span></button></div></a><div aria-labelledby="job_list___sub_heading_956_1" data-parent="#job_list___sub_accordion_956" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_956_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=72" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (72, 75), end pos: (72, 76)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Mul, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -69,7 +69,7 @@ # stored counts are already cumulative (Prometheus expectation). for b in self.buckets: if value &lt;= b: - self.counts[(labels, b)] = self.counts.get((labels, b), 0) + 1 + self.counts[(labels, b)] = self.counts.get((labels, b), 0) * 1 # Always increment +Inf bucket count inf_key = (labels, float("inf")) self.counts[inf_key] = self.counts.get(inf_key, 0) + 1</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.09s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_957"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_957_1" aria-expanded="false" aria-controls="job_list___sub_collapse_957_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_957_1"><button class="btn btn-outline-danger"><span class="job_id">957 : Job ID 27e0056048a2406e9e15fcde4b1381d1</span></button></div></a><div aria-labelledby="job_list___sub_heading_957_1" data-parent="#job_list___sub_accordion_957" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_957_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=75" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (75, 59), end pos: (75, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Mul, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -72,7 +72,7 @@ self.counts[(labels, b)] = self.counts.get((labels, b), 0) + 1 # Always increment +Inf bucket count inf_key = (labels, float("inf")) - self.counts[inf_key] = self.counts.get(inf_key, 0) + 1 + self.counts[inf_key] = self.counts.get(inf_key, 0) * 1 self.sums[labels] = self.sums.get(labels, 0.0) + value def render(self) -&gt; str:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.35s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_958"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_958_1" aria-expanded="false" aria-controls="job_list___sub_collapse_958_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_958_1"><button class="btn btn-outline-danger"><span class="job_id">958 : Job ID 3d0b7075e4d544c08273850490c9b97e</span></button></div></a><div aria-labelledby="job_list___sub_heading_958_1" data-parent="#job_list___sub_accordion_958" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_958_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=76" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (76, 55), end pos: (76, 56)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Mul, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -73,7 +73,7 @@ # Always increment +Inf bucket count inf_key = (labels, float("inf")) self.counts[inf_key] = self.counts.get(inf_key, 0) + 1 - self.sums[labels] = self.sums.get(labels, 0.0) + value + self.sums[labels] = self.sums.get(labels, 0.0) * value def render(self) -&gt; str: # Prometheus histogram:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.15s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_959"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_959_1" aria-expanded="false" aria-controls="job_list___sub_collapse_959_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_959_1"><button class="btn btn-outline-danger"><span class="job_id">959 : Job ID ef5f536069f943c8a01fa3024ca9ef1d</span></button></div></a><div aria-labelledby="job_list___sub_heading_959_1" data-parent="#job_list___sub_accordion_959" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_959_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=110" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (110, 15), end pos: (110, 16)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Mul, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -107,7 +107,7 @@ def _quote(v: str) -&gt; str: - return '"' + v.replace('"', '\\"') + '"' + return '"' * v.replace('"', '\\"') + '"' _lock = Lock()</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.41s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_960"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_960_1" aria-expanded="false" aria-controls="job_list___sub_collapse_960_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_960_1"><button class="btn btn-outline-success"><span class="job_id">960 : Job ID 775bfabb41394efda92d519238de560c</span></button></div></a><div aria-labelledby="job_list___sub_heading_960_1" data-parent="#job_list___sub_accordion_960" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_960_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=110" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (110, 39), end pos: (110, 40)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Mul, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -107,7 +107,7 @@ def _quote(v: str) -&gt; str: - return '"' + v.replace('"', '\\"') + '"' + return '"' + v.replace('"', '\\"') * '"' _lock = Lock()</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614eb8b2875e6db2d160: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.62s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_961"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_961_1" aria-expanded="false" aria-controls="job_list___sub_collapse_961_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_961_1"><button class="btn btn-outline-success"><span class="job_id">961 : Job ID 195fe42a594c4c5397643e1467f48420</span></button></div></a><div aria-labelledby="job_list___sub_heading_961_1" data-parent="#job_list___sub_accordion_961" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_961_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=322" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (322, 28), end pos: (322, 29)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Mul, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -319,7 +319,7 @@ def render_prometheus() -&gt; str: parts = [m.render() for m in _ALL] # type: ignore[attr-defined] - return "\n".join(parts) + "\n" + return "\n".join(parts) * "\n" # Convenience timer context manager (not widely used yet, but available)</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e23064893953a3842: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.68s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_962"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_962_1" aria-expanded="false" aria-controls="job_list___sub_collapse_962_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_962_1"><button class="btn btn-outline-danger"><span class="job_id">962 : Job ID 4a9a269d690c4e34845c5e3304f7bd61</span></button></div></a><div aria-labelledby="job_list___sub_heading_962_1" data-parent="#job_list___sub_accordion_962" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_962_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=40" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (40, 53), end pos: (40, 54)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Div, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -37,7 +37,7 @@ if len(label_values) != len(self.label_names): # defensive raise ValueError("Label cardinality mismatch") key = tuple(label_values) - self.values[key] = self.values.get(key, 0.0) + amount + self.values[key] = self.values.get(key, 0.0) / amount def render(self) -&gt; str: lines = [f"# HELP {self.name} {self.help}", f"# TYPE {self.name} counter"]</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.07s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_963"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_963_1" aria-expanded="false" aria-controls="job_list___sub_collapse_963_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_963_1"><button class="btn btn-outline-danger"><span class="job_id">963 : Job ID a120dd48f0804755b215afb38ffee7fc</span></button></div></a><div aria-labelledby="job_list___sub_heading_963_1" data-parent="#job_list___sub_accordion_963" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_963_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=72" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (72, 75), end pos: (72, 76)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Div, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -69,7 +69,7 @@ # stored counts are already cumulative (Prometheus expectation). for b in self.buckets: if value &lt;= b: - self.counts[(labels, b)] = self.counts.get((labels, b), 0) + 1 + self.counts[(labels, b)] = self.counts.get((labels, b), 0) / 1 # Always increment +Inf bucket count inf_key = (labels, float("inf")) self.counts[inf_key] = self.counts.get(inf_key, 0) + 1</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.04s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_964"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_964_1" aria-expanded="false" aria-controls="job_list___sub_collapse_964_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_964_1"><button class="btn btn-outline-danger"><span class="job_id">964 : Job ID 1cb3bcffe6894512a272397807483fc3</span></button></div></a><div aria-labelledby="job_list___sub_heading_964_1" data-parent="#job_list___sub_accordion_964" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_964_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=75" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (75, 59), end pos: (75, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Div, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -72,7 +72,7 @@ self.counts[(labels, b)] = self.counts.get((labels, b), 0) + 1 # Always increment +Inf bucket count inf_key = (labels, float("inf")) - self.counts[inf_key] = self.counts.get(inf_key, 0) + 1 + self.counts[inf_key] = self.counts.get(inf_key, 0) / 1 self.sums[labels] = self.sums.get(labels, 0.0) + value def render(self) -&gt; str:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.25s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_965"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_965_1" aria-expanded="false" aria-controls="job_list___sub_collapse_965_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_965_1"><button class="btn btn-outline-success"><span class="job_id">965 : Job ID fad3b63b23944bf5822ddee231be5ceb</span></button></div></a><div aria-labelledby="job_list___sub_heading_965_1" data-parent="#job_list___sub_accordion_965" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_965_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=76" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (76, 55), end pos: (76, 56)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Div, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -73,7 +73,7 @@ # Always increment +Inf bucket count inf_key = (labels, float("inf")) self.counts[inf_key] = self.counts.get(inf_key, 0) + 1 - self.sums[labels] = self.sums.get(labels, 0.0) + value + self.sums[labels] = self.sums.get(labels, 0.0) / value def render(self) -&gt; str: # Prometheus histogram:</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%]</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_966"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_966_1" aria-expanded="false" aria-controls="job_list___sub_collapse_966_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_966_1"><button class="btn btn-outline-success"><span class="job_id">966 : Job ID a1390f937f0243dd9444ded37379e0a8</span></button></div></a><div aria-labelledby="job_list___sub_heading_966_1" data-parent="#job_list___sub_accordion_966" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_966_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=110" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (110, 15), end pos: (110, 16)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Div, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -107,7 +107,7 @@ def _quote(v: str) -&gt; str: - return '"' + v.replace('"', '\\"') + '"' + return '"' / v.replace('"', '\\"') + '"' _lock = Lock()</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T210336732444Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T210337770025Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 20.82s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_967"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_967_1" aria-expanded="false" aria-controls="job_list___sub_collapse_967_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_967_1"><button class="btn btn-outline-danger"><span class="job_id">967 : Job ID 428ac78693bd4e15bd111ed62e1f003b</span></button></div></a><div aria-labelledby="job_list___sub_heading_967_1" data-parent="#job_list___sub_accordion_967" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_967_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=110" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (110, 39), end pos: (110, 40)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Div, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -107,7 +107,7 @@ def _quote(v: str) -&gt; str: - return '"' + v.replace('"', '\\"') + '"' + return '"' + v.replace('"', '\\"') / '"' _lock = Lock()</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.06s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_968"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_968_1" aria-expanded="false" aria-controls="job_list___sub_collapse_968_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_968_1"><button class="btn btn-outline-success"><span class="job_id">968 : Job ID 80bfdf36c3ae4c7d8a6d9647c1daed9b</span></button></div></a><div aria-labelledby="job_list___sub_heading_968_1" data-parent="#job_list___sub_accordion_968" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_968_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=322" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (322, 28), end pos: (322, 29)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Div, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -319,7 +319,7 @@ def render_prometheus() -&gt; str: parts = [m.render() for m in _ALL] # type: ignore[attr-defined] - return "\n".join(parts) + "\n" + return "\n".join(parts) / "\n" # Convenience timer context manager (not widely used yet, but available)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T173345013786Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T173345858634Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.25s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_969"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_969_1" aria-expanded="false" aria-controls="job_list___sub_collapse_969_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_969_1"><button class="btn btn-outline-success"><span class="job_id">969 : Job ID 44cf5d7817914f15b0868fb805948ef5</span></button></div></a><div aria-labelledby="job_list___sub_heading_969_1" data-parent="#job_list___sub_accordion_969" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_969_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=40" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (40, 53), end pos: (40, 54)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_FloorDiv, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -37,7 +37,7 @@ if len(label_values) != len(self.label_names): # defensive raise ValueError("Label cardinality mismatch") key = tuple(label_values) - self.values[key] = self.values.get(key, 0.0) + amount + self.values[key] = self.values.get(key, 0.0) // amount def render(self) -&gt; str: lines = [f"# HELP {self.name} {self.help}", f"# TYPE {self.name} counter"]</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T012621142234Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T012622102598Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.34s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_970"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_970_1" aria-expanded="false" aria-controls="job_list___sub_collapse_970_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_970_1"><button class="btn btn-outline-success"><span class="job_id">970 : Job ID fd43602968fc4eee9f7aeceb5b78ce6b</span></button></div></a><div aria-labelledby="job_list___sub_heading_970_1" data-parent="#job_list___sub_accordion_970" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_970_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=72" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (72, 75), end pos: (72, 76)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_FloorDiv, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -69,7 +69,7 @@ # stored counts are already cumulative (Prometheus expectation). for b in self.buckets: if value &lt;= b: - self.counts[(labels, b)] = self.counts.get((labels, b), 0) + 1 + self.counts[(labels, b)] = self.counts.get((labels, b), 0) // 1 # Always increment +Inf bucket count inf_key = (labels, float("inf")) self.counts[inf_key] = self.counts.get(inf_key, 0) + 1</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T235014093070Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T235014996408Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.33s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_971"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_971_1" aria-expanded="false" aria-controls="job_list___sub_collapse_971_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_971_1"><button class="btn btn-outline-danger"><span class="job_id">971 : Job ID 41c626d756ef496785d8d48e9bceed7c</span></button></div></a><div aria-labelledby="job_list___sub_heading_971_1" data-parent="#job_list___sub_accordion_971" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_971_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=75" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (75, 59), end pos: (75, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_FloorDiv, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -72,7 +72,7 @@ self.counts[(labels, b)] = self.counts.get((labels, b), 0) + 1 # Always increment +Inf bucket count inf_key = (labels, float("inf")) - self.counts[inf_key] = self.counts.get(inf_key, 0) + 1 + self.counts[inf_key] = self.counts.get(inf_key, 0) // 1 self.sums[labels] = self.sums.get(labels, 0.0) + value def render(self) -&gt; str:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.33s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_972"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_972_1" aria-expanded="false" aria-controls="job_list___sub_collapse_972_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_972_1"><button class="btn btn-outline-danger"><span class="job_id">972 : Job ID 0d6d682229ed4e2183fb9abf4e7fd690</span></button></div></a><div aria-labelledby="job_list___sub_heading_972_1" data-parent="#job_list___sub_accordion_972" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_972_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=76" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (76, 55), end pos: (76, 56)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_FloorDiv, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -73,7 +73,7 @@ # Always increment +Inf bucket count inf_key = (labels, float("inf")) self.counts[inf_key] = self.counts.get(inf_key, 0) + 1 - self.sums[labels] = self.sums.get(labels, 0.0) + value + self.sums[labels] = self.sums.get(labels, 0.0) // value def render(self) -&gt; str: # Prometheus histogram:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.39s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_973"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_973_1" aria-expanded="false" aria-controls="job_list___sub_collapse_973_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_973_1"><button class="btn btn-outline-danger"><span class="job_id">973 : Job ID 49e87ccad07f4313aa6eaa1980612d8a</span></button></div></a><div aria-labelledby="job_list___sub_heading_973_1" data-parent="#job_list___sub_accordion_973" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_973_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=110" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (110, 15), end pos: (110, 16)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_FloorDiv, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -107,7 +107,7 @@ def _quote(v: str) -&gt; str: - return '"' + v.replace('"', '\\"') + '"' + return '"' // v.replace('"', '\\"') + '"' _lock = Lock()</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.95s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_974"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_974_1" aria-expanded="false" aria-controls="job_list___sub_collapse_974_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_974_1"><button class="btn btn-outline-danger"><span class="job_id">974 : Job ID f5e2fd89c0a646f9a698b283c6456faa</span></button></div></a><div aria-labelledby="job_list___sub_heading_974_1" data-parent="#job_list___sub_accordion_974" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_974_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=110" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (110, 39), end pos: (110, 40)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_FloorDiv, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -107,7 +107,7 @@ def _quote(v: str) -&gt; str: - return '"' + v.replace('"', '\\"') + '"' + return '"' + v.replace('"', '\\"') // '"' _lock = Lock()</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.22s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_975"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_975_1" aria-expanded="false" aria-controls="job_list___sub_collapse_975_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_975_1"><button class="btn btn-outline-danger"><span class="job_id">975 : Job ID 86b07341ede74f9b80a02b5e179ba213</span></button></div></a><div aria-labelledby="job_list___sub_heading_975_1" data-parent="#job_list___sub_accordion_975" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_975_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=322" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (322, 28), end pos: (322, 29)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_FloorDiv, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -319,7 +319,7 @@ def render_prometheus() -&gt; str: parts = [m.render() for m in _ALL] # type: ignore[attr-defined] - return "\n".join(parts) + "\n" + return "\n".join(parts) // "\n" # Convenience timer context manager (not widely used yet, but available)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.86s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_976"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_976_1" aria-expanded="false" aria-controls="job_list___sub_collapse_976_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_976_1"><button class="btn btn-outline-success"><span class="job_id">976 : Job ID 17d3a860e97e4527870ed9172ae8c048</span></button></div></a><div aria-labelledby="job_list___sub_heading_976_1" data-parent="#job_list___sub_accordion_976" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_976_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=40" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (40, 53), end pos: (40, 54)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Mod, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -37,7 +37,7 @@ if len(label_values) != len(self.label_names): # defensive raise ValueError("Label cardinality mismatch") key = tuple(label_values) - self.values[key] = self.values.get(key, 0.0) + amount + self.values[key] = self.values.get(key, 0.0) % amount def render(self) -&gt; str: lines = [f"# HELP {self.name} {self.help}", f"# TYPE {self.name} counter"]</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T030248388482Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T030249331623Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.67s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_977"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_977_1" aria-expanded="false" aria-controls="job_list___sub_collapse_977_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_977_1"><button class="btn btn-outline-success"><span class="job_id">977 : Job ID 2f7f3522589e4af9977f038649d3b50c</span></button></div></a><div aria-labelledby="job_list___sub_heading_977_1" data-parent="#job_list___sub_accordion_977" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_977_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=72" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (72, 75), end pos: (72, 76)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Mod, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -69,7 +69,7 @@ # stored counts are already cumulative (Prometheus expectation). for b in self.buckets: if value &lt;= b: - self.counts[(labels, b)] = self.counts.get((labels, b), 0) + 1 + self.counts[(labels, b)] = self.counts.get((labels, b), 0) % 1 # Always increment +Inf bucket count inf_key = (labels, float("inf")) self.counts[inf_key] = self.counts.get(inf_key, 0) + 1</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T163845287218Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T163846132408Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.23s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_978"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_978_1" aria-expanded="false" aria-controls="job_list___sub_collapse_978_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_978_1"><button class="btn btn-outline-success"><span class="job_id">978 : Job ID c1f7f6cca78845df960501ea03e2d9c9</span></button></div></a><div aria-labelledby="job_list___sub_heading_978_1" data-parent="#job_list___sub_accordion_978" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_978_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=75" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (75, 59), end pos: (75, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Mod, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -72,7 +72,7 @@ self.counts[(labels, b)] = self.counts.get((labels, b), 0) + 1 # Always increment +Inf bucket count inf_key = (labels, float("inf")) - self.counts[inf_key] = self.counts.get(inf_key, 0) + 1 + self.counts[inf_key] = self.counts.get(inf_key, 0) % 1 self.sums[labels] = self.sums.get(labels, 0.0) + value def render(self) -&gt; str:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T045848483643Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T045849397737Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.79s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_979"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_979_1" aria-expanded="false" aria-controls="job_list___sub_collapse_979_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_979_1"><button class="btn btn-outline-danger"><span class="job_id">979 : Job ID 000e4a0850fa49d68f28c4c910c08466</span></button></div></a><div aria-labelledby="job_list___sub_heading_979_1" data-parent="#job_list___sub_accordion_979" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_979_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=76" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (76, 55), end pos: (76, 56)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Mod, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -73,7 +73,7 @@ # Always increment +Inf bucket count inf_key = (labels, float("inf")) self.counts[inf_key] = self.counts.get(inf_key, 0) + 1 - self.sums[labels] = self.sums.get(labels, 0.0) + value + self.sums[labels] = self.sums.get(labels, 0.0) % value def render(self) -&gt; str: # Prometheus histogram:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.49s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_980"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_980_1" aria-expanded="false" aria-controls="job_list___sub_collapse_980_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_980_1"><button class="btn btn-outline-success"><span class="job_id">980 : Job ID 2b67f5e575a544e28a8c52ed34761fc3</span></button></div></a><div aria-labelledby="job_list___sub_heading_980_1" data-parent="#job_list___sub_accordion_980" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_980_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=110" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (110, 15), end pos: (110, 16)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Mod, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -107,7 +107,7 @@ def _quote(v: str) -&gt; str: - return '"' + v.replace('"', '\\"') + '"' + return '"' % v.replace('"', '\\"') + '"' _lock = Lock()</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T164721175459Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T164722103300Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.27s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_981"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_981_1" aria-expanded="false" aria-controls="job_list___sub_collapse_981_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_981_1"><button class="btn btn-outline-danger"><span class="job_id">981 : Job ID 8535e1e1bea943d78df1698b8d5bb070</span></button></div></a><div aria-labelledby="job_list___sub_heading_981_1" data-parent="#job_list___sub_accordion_981" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_981_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=110" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (110, 39), end pos: (110, 40)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Mod, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -107,7 +107,7 @@ def _quote(v: str) -&gt; str: - return '"' + v.replace('"', '\\"') + '"' + return '"' + v.replace('"', '\\"') % '"' _lock = Lock()</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.54s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_982"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_982_1" aria-expanded="false" aria-controls="job_list___sub_collapse_982_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_982_1"><button class="btn btn-outline-success"><span class="job_id">982 : Job ID 857682266ceb4af8af68c0e2859f0e86</span></button></div></a><div aria-labelledby="job_list___sub_heading_982_1" data-parent="#job_list___sub_accordion_982" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_982_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=322" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (322, 28), end pos: (322, 29)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Mod, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -319,7 +319,7 @@ def render_prometheus() -&gt; str: parts = [m.render() for m in _ALL] # type: ignore[attr-defined] - return "\n".join(parts) + "\n" + return "\n".join(parts) % "\n" # Convenience timer context manager (not widely used yet, but available)</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....F...F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ec086e6e66d5fdd68: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 3 failed, 11 passed, 22 warnings in 20.71s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_983"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_983_1" aria-expanded="false" aria-controls="job_list___sub_collapse_983_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_983_1"><button class="btn btn-outline-success"><span class="job_id">983 : Job ID ebf1c239c61040039fb102550902fc0d</span></button></div></a><div aria-labelledby="job_list___sub_heading_983_1" data-parent="#job_list___sub_accordion_983" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_983_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=40" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (40, 53), end pos: (40, 54)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Pow, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -37,7 +37,7 @@ if len(label_values) != len(self.label_names): # defensive raise ValueError("Label cardinality mismatch") key = tuple(label_values) - self.values[key] = self.values.get(key, 0.0) + amount + self.values[key] = self.values.get(key, 0.0) ** amount def render(self) -&gt; str: lines = [f"# HELP {self.name} {self.help}", f"# TYPE {self.name} counter"]</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T223028161495Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T223028996533Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.53s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_984"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_984_1" aria-expanded="false" aria-controls="job_list___sub_collapse_984_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_984_1"><button class="btn btn-outline-success"><span class="job_id">984 : Job ID c4d839a776f04ea4bcca2ffcecce4039</span></button></div></a><div aria-labelledby="job_list___sub_heading_984_1" data-parent="#job_list___sub_accordion_984" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_984_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=72" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (72, 75), end pos: (72, 76)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Pow, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -69,7 +69,7 @@ # stored counts are already cumulative (Prometheus expectation). for b in self.buckets: if value &lt;= b: - self.counts[(labels, b)] = self.counts.get((labels, b), 0) + 1 + self.counts[(labels, b)] = self.counts.get((labels, b), 0) ** 1 # Always increment +Inf bucket count inf_key = (labels, float("inf")) self.counts[inf_key] = self.counts.get(inf_key, 0) + 1</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T164904178776Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T164905061623Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.25s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_985"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_985_1" aria-expanded="false" aria-controls="job_list___sub_collapse_985_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_985_1"><button class="btn btn-outline-success"><span class="job_id">985 : Job ID 3604f48d399e481eb6e1579ed1a72664</span></button></div></a><div aria-labelledby="job_list___sub_heading_985_1" data-parent="#job_list___sub_accordion_985" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_985_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=75" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (75, 59), end pos: (75, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Pow, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -72,7 +72,7 @@ self.counts[(labels, b)] = self.counts.get((labels, b), 0) + 1 # Always increment +Inf bucket count inf_key = (labels, float("inf")) - self.counts[inf_key] = self.counts.get(inf_key, 0) + 1 + self.counts[inf_key] = self.counts.get(inf_key, 0) ** 1 self.sums[labels] = self.sums.get(labels, 0.0) + value def render(self) -&gt; str:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T052859855941Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T052900837216Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 20.00s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_986"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_986_1" aria-expanded="false" aria-controls="job_list___sub_collapse_986_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_986_1"><button class="btn btn-outline-danger"><span class="job_id">986 : Job ID 9278eefbfcb242e6acc0e1a151e186ad</span></button></div></a><div aria-labelledby="job_list___sub_heading_986_1" data-parent="#job_list___sub_accordion_986" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_986_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=76" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (76, 55), end pos: (76, 56)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Pow, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -73,7 +73,7 @@ # Always increment +Inf bucket count inf_key = (labels, float("inf")) self.counts[inf_key] = self.counts.get(inf_key, 0) + 1 - self.sums[labels] = self.sums.get(labels, 0.0) + value + self.sums[labels] = self.sums.get(labels, 0.0) ** value def render(self) -&gt; str: # Prometheus histogram:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.15s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_987"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_987_1" aria-expanded="false" aria-controls="job_list___sub_collapse_987_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_987_1"><button class="btn btn-outline-success"><span class="job_id">987 : Job ID bdd44754ba434fb78e40c5cd5477e3e6</span></button></div></a><div aria-labelledby="job_list___sub_heading_987_1" data-parent="#job_list___sub_accordion_987" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_987_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=110" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (110, 15), end pos: (110, 16)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Pow, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -107,7 +107,7 @@ def _quote(v: str) -&gt; str: - return '"' + v.replace('"', '\\"') + '"' + return '"' ** v.replace('"', '\\"') + '"' _lock = Lock()</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T042357492367Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T042358493012Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 21.01s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_988"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_988_1" aria-expanded="false" aria-controls="job_list___sub_collapse_988_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_988_1"><button class="btn btn-outline-success"><span class="job_id">988 : Job ID 1efa4717cccf41c2a2e50ba2cfe0d040</span></button></div></a><div aria-labelledby="job_list___sub_heading_988_1" data-parent="#job_list___sub_accordion_988" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_988_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=110" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (110, 39), end pos: (110, 40)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Pow, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -107,7 +107,7 @@ def _quote(v: str) -&gt; str: - return '"' + v.replace('"', '\\"') + '"' + return '"' + v.replace('"', '\\"') ** '"' _lock = Lock()</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T033029383441Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T033030395915Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.50s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_989"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_989_1" aria-expanded="false" aria-controls="job_list___sub_collapse_989_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_989_1"><button class="btn btn-outline-danger"><span class="job_id">989 : Job ID 6eb6727c6e1a4f9ab965fedf244e8aea</span></button></div></a><div aria-labelledby="job_list___sub_heading_989_1" data-parent="#job_list___sub_accordion_989" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_989_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=322" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (322, 28), end pos: (322, 29)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Pow, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -319,7 +319,7 @@ def render_prometheus() -&gt; str: parts = [m.render() for m in _ALL] # type: ignore[attr-defined] - return "\n".join(parts) + "\n" + return "\n".join(parts) ** "\n" # Convenience timer context manager (not widely used yet, but available)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.08s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_990"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_990_1" aria-expanded="false" aria-controls="job_list___sub_collapse_990_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_990_1"><button class="btn btn-outline-success"><span class="job_id">990 : Job ID 6709ab9b854246b79b4e3e3fb208bde3</span></button></div></a><div aria-labelledby="job_list___sub_heading_990_1" data-parent="#job_list___sub_accordion_990" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_990_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=40" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (40, 53), end pos: (40, 54)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_RShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -37,7 +37,7 @@ if len(label_values) != len(self.label_names): # defensive raise ValueError("Label cardinality mismatch") key = tuple(label_values) - self.values[key] = self.values.get(key, 0.0) + amount + self.values[key] = self.values.get(key, 0.0) &gt;&gt; amount def render(self) -&gt; str: lines = [f"# HELP {self.name} {self.help}", f"# TYPE {self.name} counter"]</pre></div><div class="alert alert-secondary"><pre class="diff">..FF.....FF... [100%] ================================== FAILURES =================================== ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret &gt; resp = client.post("/api/login", json=parameters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:111: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:288: in login inc_login_success() observability.py:276: in inc_login_success LOGIN_SUCCESSES.inc() _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = CounterMetric(name='tatou_login_successes_total', help='Successful logins', values={}, label_names=()) amount = 1.0, label_values = (), key = () def inc(self, *label_values: str, amount: float = 1.0) -&gt; None: if len(label_values) != len(self.label_names): # defensive raise ValueError("Label cardinality mismatch") key = tuple(label_values) &gt; self.values[key] = self.values.get(key, 0.0) &gt;&gt; amount ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for &gt;&gt;: 'float' and 'float' observability.py:40: TypeError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: unsupported operand type(s) for &gt;&gt;: 'float' and 'float' _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } &gt; resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:147: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:411: in upload_document inc_upload(int(row.size)) observability.py:301: in inc_upload UPLOADS.inc() _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = CounterMetric(name='tatou_uploads_total', help='Number of PDF uploads', values={}, label_names=()) amount = 1.0, label_values = (), key = () def inc(self, *label_values: str, amount: float = 1.0) -&gt; None: if len(label_values) != len(self.label_names): # defensive raise ValueError("Label cardinality mismatch") key = tuple(label_values) &gt; self.values[key] = self.values.get(key, 0.0) &gt;&gt; amount ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for &gt;&gt;: 'float' and 'float' observability.py:40: TypeError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: unsupported operand type(s) for &gt;&gt;: 'float' and 'float' _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} &gt; resp = client.post("/api/create-watermark", json=parameters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:317: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:1115: in create_watermark inc_watermark_created(method) observability.py:281: in inc_watermark_created WATERMARK_CREATED.inc(method) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = CounterMetric(name='tatou_watermarks_created_total', help='Watermarks created', values={}, label_names=('method',)) amount = 1.0, label_values = ('robust-xmp',), key = ('robust-xmp',) def inc(self, *label_values: str, amount: float = 1.0) -&gt; None: if len(label_values) != len(self.label_names): # defensive raise ValueError("Label cardinality mismatch") key = tuple(label_values) &gt; self.values[key] = self.values.get(key, 0.0) &gt;&gt; amount ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for &gt;&gt;: 'float' and 'float' observability.py:40: TypeError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: unsupported operand type(s) for &gt;&gt;: 'float' and 'float' __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } &gt; upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:387: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:411: in upload_document inc_upload(int(row.size)) observability.py:301: in inc_upload UPLOADS.inc() _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = CounterMetric(name='tatou_uploads_total', help='Number of PDF uploads', values={}, label_names=()) amount = 1.0, label_values = (), key = () def inc(self, *label_values: str, amount: float = 1.0) -&gt; None: if len(label_values) != len(self.label_names): # defensive raise ValueError("Label cardinality mismatch") key = tuple(label_values) &gt; self.values[key] = self.values.get(key, 0.0) &gt;&gt; amount ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for &gt;&gt;: 'float' and 'float' observability.py:40: TypeError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: unsupported operand type(s) for &gt;&gt;: 'float' and 'float' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_login_route - TypeError: unsupported operand... FAILED ..\test\test_api.py::test_upload_document_route - TypeError: unsupport... FAILED ..\test\test_api.py::test_create_watermark_route - TypeError: unsuppor... FAILED ..\test\test_api.py::test_read_watermark_route - TypeError: unsupporte... 4 failed, 10 passed, 22 warnings in 19.84s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_991"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_991_1" aria-expanded="false" aria-controls="job_list___sub_collapse_991_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_991_1"><button class="btn btn-outline-success"><span class="job_id">991 : Job ID ec286c0dfd574b18abef6a668c796f63</span></button></div></a><div aria-labelledby="job_list___sub_heading_991_1" data-parent="#job_list___sub_accordion_991" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_991_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=72" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (72, 75), end pos: (72, 76)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_RShift, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -69,7 +69,7 @@ # stored counts are already cumulative (Prometheus expectation). for b in self.buckets: if value &lt;= b: - self.counts[(labels, b)] = self.counts.get((labels, b), 0) + 1 + self.counts[(labels, b)] = self.counts.get((labels, b), 0) &gt;&gt; 1 # Always increment +Inf bucket count inf_key = (labels, float("inf")) self.counts[inf_key] = self.counts.get(inf_key, 0) + 1</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%]</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_992"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_992_1" aria-expanded="false" aria-controls="job_list___sub_collapse_992_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_992_1"><button class="btn btn-outline-danger"><span class="job_id">992 : Job ID be89810c60704c45bc4f0b507d6a5e9b</span></button></div></a><div aria-labelledby="job_list___sub_heading_992_1" data-parent="#job_list___sub_accordion_992" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_992_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=75" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (75, 59), end pos: (75, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_RShift, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -72,7 +72,7 @@ self.counts[(labels, b)] = self.counts.get((labels, b), 0) + 1 # Always increment +Inf bucket count inf_key = (labels, float("inf")) - self.counts[inf_key] = self.counts.get(inf_key, 0) + 1 + self.counts[inf_key] = self.counts.get(inf_key, 0) &gt;&gt; 1 self.sums[labels] = self.sums.get(labels, 0.0) + value def render(self) -&gt; str:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.82s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_993"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_993_1" aria-expanded="false" aria-controls="job_list___sub_collapse_993_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_993_1"><button class="btn btn-outline-success"><span class="job_id">993 : Job ID fc662e12d87948558b672171048d6f0f</span></button></div></a><div aria-labelledby="job_list___sub_heading_993_1" data-parent="#job_list___sub_accordion_993" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_993_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=76" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (76, 55), end pos: (76, 56)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_RShift, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -73,7 +73,7 @@ # Always increment +Inf bucket count inf_key = (labels, float("inf")) self.counts[inf_key] = self.counts.get(inf_key, 0) + 1 - self.sums[labels] = self.sums.get(labels, 0.0) + value + self.sums[labels] = self.sums.get(labels, 0.0) &gt;&gt; value def render(self) -&gt; str: # Prometheus histogram:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: unsupported operand type(s) for &gt;&gt;: 'float' and 'float' ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) WARNING server:server.py:160 after_request instrumentation failed: unsupported operand type(s) for &gt;&gt;: 'float' and 'float' ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: unsupported operand type(s) for &gt;&gt;: 'float' and 'float' WARNING server:server.py:272 Failed login attempt for email: user@email.se WARNING server:server.py:160 after_request instrumentation failed: unsupported operand type(s) for &gt;&gt;: 'float' and 'float' _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: unsupported operand type(s) for &gt;&gt;: 'float' and 'float' ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T233354793668Z__input.pdf user=1 WARNING server:server.py:160 after_request instrumentation failed: unsupported operand type(s) for &gt;&gt;: 'float' and 'float' __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 WARNING server:server.py:160 after_request instrumentation failed: unsupported operand type(s) for &gt;&gt;: 'float' and 'float' ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 WARNING server:server.py:160 after_request instrumentation failed: unsupported operand type(s) for &gt;&gt;: 'float' and 'float' _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: unsupported operand type(s) for &gt;&gt;: 'float' and 'float' WARNING server:server.py:972 Document not found or access denied for watermarking id=1 WARNING server:server.py:160 after_request instrumentation failed: unsupported operand type(s) for &gt;&gt;: 'float' and 'float' __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: unsupported operand type(s) for &gt;&gt;: 'float' and 'float' ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T233355768149Z__watermarked.pdf user=1 WARNING server:server.py:160 after_request instrumentation failed: unsupported operand type(s) for &gt;&gt;: 'float' and 'float' _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: unsupported operand type(s) for &gt;&gt;: 'float' and 'float' WARNING server:server.py:850 Document not found or access denied for deletion id=2 WARNING server:server.py:160 after_request instrumentation failed: unsupported operand type(s) for &gt;&gt;: 'float' and 'float' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.42s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_994"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_994_1" aria-expanded="false" aria-controls="job_list___sub_collapse_994_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_994_1"><button class="btn btn-outline-danger"><span class="job_id">994 : Job ID e169ed439db04e70bef4ae01bf79bb9c</span></button></div></a><div aria-labelledby="job_list___sub_heading_994_1" data-parent="#job_list___sub_accordion_994" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_994_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=110" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (110, 15), end pos: (110, 16)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_RShift, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -107,7 +107,7 @@ def _quote(v: str) -&gt; str: - return '"' + v.replace('"', '\\"') + '"' + return '"' &gt;&gt; v.replace('"', '\\"') + '"' _lock = Lock()</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.46s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_995"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_995_1" aria-expanded="false" aria-controls="job_list___sub_collapse_995_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_995_1"><button class="btn btn-outline-success"><span class="job_id">995 : Job ID b81230aa209a475eb403224adf00d0d4</span></button></div></a><div aria-labelledby="job_list___sub_heading_995_1" data-parent="#job_list___sub_accordion_995" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_995_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=110" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (110, 39), end pos: (110, 40)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_RShift, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -107,7 +107,7 @@ def _quote(v: str) -&gt; str: - return '"' + v.replace('"', '\\"') + '"' + return '"' + v.replace('"', '\\"') &gt;&gt; '"' _lock = Lock()</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T211816785125Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T211817771179Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 20.18s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_996"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_996_1" aria-expanded="false" aria-controls="job_list___sub_collapse_996_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_996_1"><button class="btn btn-outline-success"><span class="job_id">996 : Job ID 1115f7bdeffc436c88dac0e495480512</span></button></div></a><div aria-labelledby="job_list___sub_heading_996_1" data-parent="#job_list___sub_accordion_996" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_996_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=322" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (322, 28), end pos: (322, 29)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_RShift, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -319,7 +319,7 @@ def render_prometheus() -&gt; str: parts = [m.render() for m in _ALL] # type: ignore[attr-defined] - return "\n".join(parts) + "\n" + return "\n".join(parts) &gt;&gt; "\n" # Convenience timer context manager (not widely used yet, but available)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T041150010425Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T041151087129Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 21.40s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_997"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_997_1" aria-expanded="false" aria-controls="job_list___sub_collapse_997_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_997_1"><button class="btn btn-outline-success"><span class="job_id">997 : Job ID 343d638d07db45f881a2669f3bb2dcc2</span></button></div></a><div aria-labelledby="job_list___sub_heading_997_1" data-parent="#job_list___sub_accordion_997" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_997_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=40" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (40, 53), end pos: (40, 54)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_LShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -37,7 +37,7 @@ if len(label_values) != len(self.label_names): # defensive raise ValueError("Label cardinality mismatch") key = tuple(label_values) - self.values[key] = self.values.get(key, 0.0) + amount + self.values[key] = self.values.get(key, 0.0) &lt;&lt; amount def render(self) -&gt; str: lines = [f"# HELP {self.name} {self.help}", f"# TYPE {self.name} counter"]</pre></div><div class="alert alert-secondary"><pre class="diff">..FF.....FF... [100%] ================================== FAILURES =================================== ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret &gt; resp = client.post("/api/login", json=parameters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:111: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:288: in login inc_login_success() observability.py:276: in inc_login_success LOGIN_SUCCESSES.inc() _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = CounterMetric(name='tatou_login_successes_total', help='Successful logins', values={}, label_names=()) amount = 1.0, label_values = (), key = () def inc(self, *label_values: str, amount: float = 1.0) -&gt; None: if len(label_values) != len(self.label_names): # defensive raise ValueError("Label cardinality mismatch") key = tuple(label_values) &gt; self.values[key] = self.values.get(key, 0.0) &lt;&lt; amount ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for &lt;&lt;: 'float' and 'float' observability.py:40: TypeError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: unsupported operand type(s) for &lt;&lt;: 'float' and 'float' _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } &gt; resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:147: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:411: in upload_document inc_upload(int(row.size)) observability.py:301: in inc_upload UPLOADS.inc() _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = CounterMetric(name='tatou_uploads_total', help='Number of PDF uploads', values={}, label_names=()) amount = 1.0, label_values = (), key = () def inc(self, *label_values: str, amount: float = 1.0) -&gt; None: if len(label_values) != len(self.label_names): # defensive raise ValueError("Label cardinality mismatch") key = tuple(label_values) &gt; self.values[key] = self.values.get(key, 0.0) &lt;&lt; amount ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for &lt;&lt;: 'float' and 'float' observability.py:40: TypeError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: unsupported operand type(s) for &lt;&lt;: 'float' and 'float' _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} &gt; resp = client.post("/api/create-watermark", json=parameters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:317: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:1115: in create_watermark inc_watermark_created(method) observability.py:281: in inc_watermark_created WATERMARK_CREATED.inc(method) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = CounterMetric(name='tatou_watermarks_created_total', help='Watermarks created', values={}, label_names=('method',)) amount = 1.0, label_values = ('robust-xmp',), key = ('robust-xmp',) def inc(self, *label_values: str, amount: float = 1.0) -&gt; None: if len(label_values) != len(self.label_names): # defensive raise ValueError("Label cardinality mismatch") key = tuple(label_values) &gt; self.values[key] = self.values.get(key, 0.0) &lt;&lt; amount ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for &lt;&lt;: 'float' and 'float' observability.py:40: TypeError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: unsupported operand type(s) for &lt;&lt;: 'float' and 'float' __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } &gt; upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:387: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:411: in upload_document inc_upload(int(row.size)) observability.py:301: in inc_upload UPLOADS.inc() _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = CounterMetric(name='tatou_uploads_total', help='Number of PDF uploads', values={}, label_names=()) amount = 1.0, label_values = (), key = () def inc(self, *label_values: str, amount: float = 1.0) -&gt; None: if len(label_values) != len(self.label_names): # defensive raise ValueError("Label cardinality mismatch") key = tuple(label_values) &gt; self.values[key] = self.values.get(key, 0.0) &lt;&lt; amount ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for &lt;&lt;: 'float' and 'float' observability.py:40: TypeError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: unsupported operand type(s) for &lt;&lt;: 'float' and 'float' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_login_route - TypeError: unsupported operand... FAILED ..\test\test_api.py::test_upload_document_route - TypeError: unsupport... FAILED ..\test\test_api.py::test_create_watermark_route - TypeError: unsuppor... FAILED ..\test\test_api.py::test_read_watermark_route - TypeError: unsupporte... 4 failed, 10 passed, 22 warnings in 21.34s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_998"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_998_1" aria-expanded="false" aria-controls="job_list___sub_collapse_998_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_998_1"><button class="btn btn-outline-danger"><span class="job_id">998 : Job ID 725669b2802e4fc7be76704d1ff21b8b</span></button></div></a><div aria-labelledby="job_list___sub_heading_998_1" data-parent="#job_list___sub_accordion_998" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_998_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=72" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (72, 75), end pos: (72, 76)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_LShift, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -69,7 +69,7 @@ # stored counts are already cumulative (Prometheus expectation). for b in self.buckets: if value &lt;= b: - self.counts[(labels, b)] = self.counts.get((labels, b), 0) + 1 + self.counts[(labels, b)] = self.counts.get((labels, b), 0) &lt;&lt; 1 # Always increment +Inf bucket count inf_key = (labels, float("inf")) self.counts[inf_key] = self.counts.get(inf_key, 0) + 1</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.38s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_999"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_999_1" aria-expanded="false" aria-controls="job_list___sub_collapse_999_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_999_1"><button class="btn btn-outline-success"><span class="job_id">999 : Job ID 52254800c59b4675acac30910cb60378</span></button></div></a><div aria-labelledby="job_list___sub_heading_999_1" data-parent="#job_list___sub_accordion_999" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_999_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=75" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (75, 59), end pos: (75, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_LShift, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -72,7 +72,7 @@ self.counts[(labels, b)] = self.counts.get((labels, b), 0) + 1 # Always increment +Inf bucket count inf_key = (labels, float("inf")) - self.counts[inf_key] = self.counts.get(inf_key, 0) + 1 + self.counts[inf_key] = self.counts.get(inf_key, 0) &lt;&lt; 1 self.sums[labels] = self.sums.get(labels, 0.0) + value def render(self) -&gt; str:</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....F...F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e396046cc83a6fb69: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 3 failed, 11 passed, 22 warnings in 21.33s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1000"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1000_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1000_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1000_1"><button class="btn btn-outline-success"><span class="job_id">1000 : Job ID 5e6c9a3857734156ae19f1c397fb932c</span></button></div></a><div aria-labelledby="job_list___sub_heading_1000_1" data-parent="#job_list___sub_accordion_1000" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1000_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=76" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (76, 55), end pos: (76, 56)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_LShift, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -73,7 +73,7 @@ # Always increment +Inf bucket count inf_key = (labels, float("inf")) self.counts[inf_key] = self.counts.get(inf_key, 0) + 1 - self.sums[labels] = self.sums.get(labels, 0.0) + value + self.sums[labels] = self.sums.get(labels, 0.0) &lt;&lt; value def render(self) -&gt; str: # Prometheus histogram:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.....FF... [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: unsupported operand type(s) for &lt;&lt;: 'float' and 'float' ERROR server:server.py:236 Database error in create_user: unsupported operand type(s) for &lt;&lt;: 'float' and 'float' WARNING server:server.py:160 after_request instrumentation failed: unsupported operand type(s) for &lt;&lt;: 'float' and 'float' ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret &gt; resp = client.post("/api/login", json=parameters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:111: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:284: in login observe_db_latency("login_select", time.time() - start_db) observability.py:317: in observe_db_latency DB_QUERY_LATENCY.observe(duration, op) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = HistogramMetric(name='tatou_db_query_duration_seconds', help='Duration of DB operations (best-effort manual instrument...ogin_select',), 0.5): 1, (('login_select',), 1): 1, (('login_select',), 2.5): 1, (('login_select',), inf): 1}, sums={}) value = 0.10988640785217285, label_values = ('login_select',) labels = ('login_select',), b = 2.5, inf_key = (('login_select',), inf) def observe(self, value: float, *label_values: str) -&gt; None: if len(label_values) != len(self.label_names): raise ValueError("Label cardinality mismatch") labels = tuple(label_values) # Increment every bucket whose upper bound is &gt;= value so that # stored counts are already cumulative (Prometheus expectation). for b in self.buckets: if value &lt;= b: self.counts[(labels, b)] = self.counts.get((labels, b), 0) + 1 # Always increment +Inf bucket count inf_key = (labels, float("inf")) self.counts[inf_key] = self.counts.get(inf_key, 0) + 1 &gt; self.sums[labels] = self.sums.get(labels, 0.0) &lt;&lt; value ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for &lt;&lt;: 'float' and 'float' observability.py:76: TypeError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: unsupported operand type(s) for &lt;&lt;: 'float' and 'float' _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } &gt; resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:147: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:401: in upload_document observe_db_latency("insert_document", time.time() - start_db) observability.py:317: in observe_db_latency DB_QUERY_LATENCY.observe(duration, op) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = HistogramMetric(name='tatou_db_query_duration_seconds', help='Duration of DB operations (best-effort manual instrument...nt',), 0.5): 1, (('insert_document',), 1): 1, (('insert_document',), 2.5): 1, (('insert_document',), inf): 1}, sums={}) value = 0.06377720832824707, label_values = ('insert_document',) labels = ('insert_document',), b = 2.5, inf_key = (('insert_document',), inf) def observe(self, value: float, *label_values: str) -&gt; None: if len(label_values) != len(self.label_names): raise ValueError("Label cardinality mismatch") labels = tuple(label_values) # Increment every bucket whose upper bound is &gt;= value so that # stored counts are already cumulative (Prometheus expectation). for b in self.buckets: if value &lt;= b: self.counts[(labels, b)] = self.counts.get((labels, b), 0) + 1 # Always increment +Inf bucket count inf_key = (labels, float("inf")) self.counts[inf_key] = self.counts.get(inf_key, 0) + 1 &gt; self.sums[labels] = self.sums.get(labels, 0.0) &lt;&lt; value ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for &lt;&lt;: 'float' and 'float' observability.py:76: TypeError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: unsupported operand type(s) for &lt;&lt;: 'float' and 'float' _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: unsupported operand type(s) for &lt;&lt;: 'float' and 'float' ERROR server:server.py:1034 Watermarking failed for document 1 using method robust-xmp: unsupported operand type(s) for &lt;&lt;: 'float' and 'float' WARNING server:server.py:160 after_request instrumentation failed: unsupported operand type(s) for &lt;&lt;: 'float' and 'float' __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } &gt; upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:387: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:401: in upload_document observe_db_latency("insert_document", time.time() - start_db) observability.py:317: in observe_db_latency DB_QUERY_LATENCY.observe(duration, op) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = HistogramMetric(name='tatou_db_query_duration_seconds', help='Duration of DB operations (best-effort manual instrument...nt',), 0.5): 2, (('insert_document',), 1): 2, (('insert_document',), 2.5): 2, (('insert_document',), inf): 2}, sums={}) value = 0.05775713920593262, label_values = ('insert_document',) labels = ('insert_document',), b = 2.5, inf_key = (('insert_document',), inf) def observe(self, value: float, *label_values: str) -&gt; None: if len(label_values) != len(self.label_names): raise ValueError("Label cardinality mismatch") labels = tuple(label_values) # Increment every bucket whose upper bound is &gt;= value so that # stored counts are already cumulative (Prometheus expectation). for b in self.buckets: if value &lt;= b: self.counts[(labels, b)] = self.counts.get((labels, b), 0) + 1 # Always increment +Inf bucket count inf_key = (labels, float("inf")) self.counts[inf_key] = self.counts.get(inf_key, 0) + 1 &gt; self.sums[labels] = self.sums.get(labels, 0.0) &lt;&lt; value ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for &lt;&lt;: 'float' and 'float' observability.py:76: TypeError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: unsupported operand type(s) for &lt;&lt;: 'float' and 'float' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - TypeError: unsupported operand... FAILED ..\test\test_api.py::test_upload_document_route - TypeError: unsupport... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - TypeError: unsupporte... 5 failed, 9 passed, 22 warnings in 19.78s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1001"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1001_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1001_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1001_1"><button class="btn btn-outline-danger"><span class="job_id">1001 : Job ID f8fd513ffbf14c3a8e6f99ecd0cbe512</span></button></div></a><div aria-labelledby="job_list___sub_heading_1001_1" data-parent="#job_list___sub_accordion_1001" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1001_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=110" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (110, 15), end pos: (110, 16)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_LShift, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -107,7 +107,7 @@ def _quote(v: str) -&gt; str: - return '"' + v.replace('"', '\\"') + '"' + return '"' &lt;&lt; v.replace('"', '\\"') + '"' _lock = Lock()</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.14s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1002"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1002_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1002_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1002_1"><button class="btn btn-outline-danger"><span class="job_id">1002 : Job ID 7976c861d2634663a12a0cc37d07b90c</span></button></div></a><div aria-labelledby="job_list___sub_heading_1002_1" data-parent="#job_list___sub_accordion_1002" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1002_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=110" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (110, 39), end pos: (110, 40)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_LShift, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -107,7 +107,7 @@ def _quote(v: str) -&gt; str: - return '"' + v.replace('"', '\\"') + '"' + return '"' + v.replace('"', '\\"') &lt;&lt; '"' _lock = Lock()</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.20s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1003"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1003_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1003_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1003_1"><button class="btn btn-outline-success"><span class="job_id">1003 : Job ID 8331f42d8eb94e679177421e5c6a34fb</span></button></div></a><div aria-labelledby="job_list___sub_heading_1003_1" data-parent="#job_list___sub_accordion_1003" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1003_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=322" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (322, 28), end pos: (322, 29)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_LShift, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -319,7 +319,7 @@ def render_prometheus() -&gt; str: parts = [m.render() for m in _ALL] # type: ignore[attr-defined] - return "\n".join(parts) + "\n" + return "\n".join(parts) &lt;&lt; "\n" # Convenience timer context manager (not widely used yet, but available)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T051428062409Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T051429666030Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 25.34s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1004"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1004_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1004_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1004_1"><button class="btn btn-outline-success"><span class="job_id">1004 : Job ID 73b8a107af514a799be377793d9273fd</span></button></div></a><div aria-labelledby="job_list___sub_heading_1004_1" data-parent="#job_list___sub_accordion_1004" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1004_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=40" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (40, 53), end pos: (40, 54)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitOr, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -37,7 +37,7 @@ if len(label_values) != len(self.label_names): # defensive raise ValueError("Label cardinality mismatch") key = tuple(label_values) - self.values[key] = self.values.get(key, 0.0) + amount + self.values[key] = self.values.get(key, 0.0) | amount def render(self) -&gt; str: lines = [f"# HELP {self.name} {self.help}", f"# TYPE {self.name} counter"]</pre></div><div class="alert alert-secondary"><pre class="diff">..FF.....FF... [100%] ================================== FAILURES =================================== ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret &gt; resp = client.post("/api/login", json=parameters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:111: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:288: in login inc_login_success() observability.py:276: in inc_login_success LOGIN_SUCCESSES.inc() _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = CounterMetric(name='tatou_login_successes_total', help='Successful logins', values={}, label_names=()) amount = 1.0, label_values = (), key = () def inc(self, *label_values: str, amount: float = 1.0) -&gt; None: if len(label_values) != len(self.label_names): # defensive raise ValueError("Label cardinality mismatch") key = tuple(label_values) &gt; self.values[key] = self.values.get(key, 0.0) | amount ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for |: 'float' and 'float' observability.py:40: TypeError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: unsupported operand type(s) for |: 'float' and 'float' _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } &gt; resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:147: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:411: in upload_document inc_upload(int(row.size)) observability.py:301: in inc_upload UPLOADS.inc() _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = CounterMetric(name='tatou_uploads_total', help='Number of PDF uploads', values={}, label_names=()) amount = 1.0, label_values = (), key = () def inc(self, *label_values: str, amount: float = 1.0) -&gt; None: if len(label_values) != len(self.label_names): # defensive raise ValueError("Label cardinality mismatch") key = tuple(label_values) &gt; self.values[key] = self.values.get(key, 0.0) | amount ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for |: 'float' and 'float' observability.py:40: TypeError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: unsupported operand type(s) for |: 'float' and 'float' _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} &gt; resp = client.post("/api/create-watermark", json=parameters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:317: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:1115: in create_watermark inc_watermark_created(method) observability.py:281: in inc_watermark_created WATERMARK_CREATED.inc(method) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = CounterMetric(name='tatou_watermarks_created_total', help='Watermarks created', values={}, label_names=('method',)) amount = 1.0, label_values = ('robust-xmp',), key = ('robust-xmp',) def inc(self, *label_values: str, amount: float = 1.0) -&gt; None: if len(label_values) != len(self.label_names): # defensive raise ValueError("Label cardinality mismatch") key = tuple(label_values) &gt; self.values[key] = self.values.get(key, 0.0) | amount ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for |: 'float' and 'float' observability.py:40: TypeError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: unsupported operand type(s) for |: 'float' and 'float' __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } &gt; upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:387: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:411: in upload_document inc_upload(int(row.size)) observability.py:301: in inc_upload UPLOADS.inc() _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = CounterMetric(name='tatou_uploads_total', help='Number of PDF uploads', values={}, label_names=()) amount = 1.0, label_values = (), key = () def inc(self, *label_values: str, amount: float = 1.0) -&gt; None: if len(label_values) != len(self.label_names): # defensive raise ValueError("Label cardinality mismatch") key = tuple(label_values) &gt; self.values[key] = self.values.get(key, 0.0) | amount ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for |: 'float' and 'float' observability.py:40: TypeError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: unsupported operand type(s) for |: 'float' and 'float' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_login_route - TypeError: unsupported operand... FAILED ..\test\test_api.py::test_upload_document_route - TypeError: unsupport... FAILED ..\test\test_api.py::test_create_watermark_route - TypeError: unsuppor... FAILED ..\test\test_api.py::test_read_watermark_route - TypeError: unsupporte... 4 failed, 10 passed, 22 warnings in 20.13s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1005"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1005_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1005_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1005_1"><button class="btn btn-outline-danger"><span class="job_id">1005 : Job ID 9b17f4423a474ca3a13b74021815ccbb</span></button></div></a><div aria-labelledby="job_list___sub_heading_1005_1" data-parent="#job_list___sub_accordion_1005" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1005_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=72" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (72, 75), end pos: (72, 76)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitOr, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -69,7 +69,7 @@ # stored counts are already cumulative (Prometheus expectation). for b in self.buckets: if value &lt;= b: - self.counts[(labels, b)] = self.counts.get((labels, b), 0) + 1 + self.counts[(labels, b)] = self.counts.get((labels, b), 0) | 1 # Always increment +Inf bucket count inf_key = (labels, float("inf")) self.counts[inf_key] = self.counts.get(inf_key, 0) + 1</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.12s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1006"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1006_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1006_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1006_1"><button class="btn btn-outline-danger"><span class="job_id">1006 : Job ID 3f2fb8a3c41f4f1bbe30b9cfb2066d5f</span></button></div></a><div aria-labelledby="job_list___sub_heading_1006_1" data-parent="#job_list___sub_accordion_1006" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1006_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=75" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (75, 59), end pos: (75, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitOr, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -72,7 +72,7 @@ self.counts[(labels, b)] = self.counts.get((labels, b), 0) + 1 # Always increment +Inf bucket count inf_key = (labels, float("inf")) - self.counts[inf_key] = self.counts.get(inf_key, 0) + 1 + self.counts[inf_key] = self.counts.get(inf_key, 0) | 1 self.sums[labels] = self.sums.get(labels, 0.0) + value def render(self) -&gt; str:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.26s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1007"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1007_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1007_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1007_1"><button class="btn btn-outline-success"><span class="job_id">1007 : Job ID 2185bc4f287a4c9a98d206c00bb44c8b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1007_1" data-parent="#job_list___sub_accordion_1007" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1007_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=76" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (76, 55), end pos: (76, 56)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitOr, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -73,7 +73,7 @@ # Always increment +Inf bucket count inf_key = (labels, float("inf")) self.counts[inf_key] = self.counts.get(inf_key, 0) + 1 - self.sums[labels] = self.sums.get(labels, 0.0) + value + self.sums[labels] = self.sums.get(labels, 0.0) | value def render(self) -&gt; str: # Prometheus histogram:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: unsupported operand type(s) for |: 'float' and 'float' ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) WARNING server:server.py:160 after_request instrumentation failed: unsupported operand type(s) for |: 'float' and 'float' ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: unsupported operand type(s) for |: 'float' and 'float' ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) WARNING server:server.py:160 after_request instrumentation failed: unsupported operand type(s) for |: 'float' and 'float' _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: unsupported operand type(s) for |: 'float' and 'float' ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T044459311662Z__input.pdf user=1 WARNING server:server.py:160 after_request instrumentation failed: unsupported operand type(s) for |: 'float' and 'float' __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 WARNING server:server.py:160 after_request instrumentation failed: unsupported operand type(s) for |: 'float' and 'float' __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 WARNING server:server.py:160 after_request instrumentation failed: unsupported operand type(s) for |: 'float' and 'float' ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 WARNING server:server.py:160 after_request instrumentation failed: unsupported operand type(s) for |: 'float' and 'float' ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 WARNING server:server.py:160 after_request instrumentation failed: unsupported operand type(s) for |: 'float' and 'float' _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: unsupported operand type(s) for |: 'float' and 'float' ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) WARNING server:server.py:160 after_request instrumentation failed: unsupported operand type(s) for |: 'float' and 'float' __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: unsupported operand type(s) for |: 'float' and 'float' ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T044500546182Z__watermarked.pdf user=1 WARNING server:server.py:160 after_request instrumentation failed: unsupported operand type(s) for |: 'float' and 'float' _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: unsupported operand type(s) for |: 'float' and 'float' WARNING server:server.py:850 Document not found or access denied for deletion id=2 WARNING server:server.py:160 after_request instrumentation failed: unsupported operand type(s) for |: 'float' and 'float' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 21.48s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1008"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1008_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1008_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1008_1"><button class="btn btn-outline-danger"><span class="job_id">1008 : Job ID 7018d6c854cc43f5a3b4321b5a6a2f1c</span></button></div></a><div aria-labelledby="job_list___sub_heading_1008_1" data-parent="#job_list___sub_accordion_1008" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1008_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=110" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (110, 15), end pos: (110, 16)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitOr, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -107,7 +107,7 @@ def _quote(v: str) -&gt; str: - return '"' + v.replace('"', '\\"') + '"' + return '"' | v.replace('"', '\\"') + '"' _lock = Lock()</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.93s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1009"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1009_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1009_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1009_1"><button class="btn btn-outline-danger"><span class="job_id">1009 : Job ID 0dff6f7f83134ff69084986a385a2dd2</span></button></div></a><div aria-labelledby="job_list___sub_heading_1009_1" data-parent="#job_list___sub_accordion_1009" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1009_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=110" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (110, 39), end pos: (110, 40)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitOr, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -107,7 +107,7 @@ def _quote(v: str) -&gt; str: - return '"' + v.replace('"', '\\"') + '"' + return '"' + v.replace('"', '\\"') | '"' _lock = Lock()</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.95s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1010"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1010_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1010_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1010_1"><button class="btn btn-outline-success"><span class="job_id">1010 : Job ID 83ecbdae9ebe4d8592eb9a64af0e3616</span></button></div></a><div aria-labelledby="job_list___sub_heading_1010_1" data-parent="#job_list___sub_accordion_1010" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1010_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=322" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (322, 28), end pos: (322, 29)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitOr, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -319,7 +319,7 @@ def render_prometheus() -&gt; str: parts = [m.render() for m in _ALL] # type: ignore[attr-defined] - return "\n".join(parts) + "\n" + return "\n".join(parts) | "\n" # Convenience timer context manager (not widely used yet, but available)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T185358548578Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T185359544694Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 20.15s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1011"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1011_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1011_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1011_1"><button class="btn btn-outline-success"><span class="job_id">1011 : Job ID 0dace994f9274ac8bc9fc9da0bd78cf6</span></button></div></a><div aria-labelledby="job_list___sub_heading_1011_1" data-parent="#job_list___sub_accordion_1011" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1011_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=40" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (40, 53), end pos: (40, 54)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitAnd, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -37,7 +37,7 @@ if len(label_values) != len(self.label_names): # defensive raise ValueError("Label cardinality mismatch") key = tuple(label_values) - self.values[key] = self.values.get(key, 0.0) + amount + self.values[key] = self.values.get(key, 0.0) &amp; amount def render(self) -&gt; str: lines = [f"# HELP {self.name} {self.help}", f"# TYPE {self.name} counter"]</pre></div><div class="alert alert-secondary"><pre class="diff">..FF.....FF... [100%] ================================== FAILURES =================================== ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret &gt; resp = client.post("/api/login", json=parameters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:111: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:288: in login inc_login_success() observability.py:276: in inc_login_success LOGIN_SUCCESSES.inc() _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = CounterMetric(name='tatou_login_successes_total', help='Successful logins', values={}, label_names=()) amount = 1.0, label_values = (), key = () def inc(self, *label_values: str, amount: float = 1.0) -&gt; None: if len(label_values) != len(self.label_names): # defensive raise ValueError("Label cardinality mismatch") key = tuple(label_values) &gt; self.values[key] = self.values.get(key, 0.0) &amp; amount ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for &amp;: 'float' and 'float' observability.py:40: TypeError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: unsupported operand type(s) for &amp;: 'float' and 'float' _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } &gt; resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:147: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:411: in upload_document inc_upload(int(row.size)) observability.py:301: in inc_upload UPLOADS.inc() _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = CounterMetric(name='tatou_uploads_total', help='Number of PDF uploads', values={}, label_names=()) amount = 1.0, label_values = (), key = () def inc(self, *label_values: str, amount: float = 1.0) -&gt; None: if len(label_values) != len(self.label_names): # defensive raise ValueError("Label cardinality mismatch") key = tuple(label_values) &gt; self.values[key] = self.values.get(key, 0.0) &amp; amount ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for &amp;: 'float' and 'float' observability.py:40: TypeError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: unsupported operand type(s) for &amp;: 'float' and 'float' _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} &gt; resp = client.post("/api/create-watermark", json=parameters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:317: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:1115: in create_watermark inc_watermark_created(method) observability.py:281: in inc_watermark_created WATERMARK_CREATED.inc(method) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = CounterMetric(name='tatou_watermarks_created_total', help='Watermarks created', values={}, label_names=('method',)) amount = 1.0, label_values = ('robust-xmp',), key = ('robust-xmp',) def inc(self, *label_values: str, amount: float = 1.0) -&gt; None: if len(label_values) != len(self.label_names): # defensive raise ValueError("Label cardinality mismatch") key = tuple(label_values) &gt; self.values[key] = self.values.get(key, 0.0) &amp; amount ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for &amp;: 'float' and 'float' observability.py:40: TypeError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: unsupported operand type(s) for &amp;: 'float' and 'float' __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } &gt; upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:387: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:411: in upload_document inc_upload(int(row.size)) observability.py:301: in inc_upload UPLOADS.inc() _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = CounterMetric(name='tatou_uploads_total', help='Number of PDF uploads', values={}, label_names=()) amount = 1.0, label_values = (), key = () def inc(self, *label_values: str, amount: float = 1.0) -&gt; None: if len(label_values) != len(self.label_names): # defensive raise ValueError("Label cardinality mismatch") key = tuple(label_values) &gt; self.values[key] = self.values.get(key, 0.0) &amp; amount ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for &amp;: 'float' and 'float' observability.py:40: TypeError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: unsupported operand type(s) for &amp;: 'float' and 'float' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_login_route - TypeError: unsupported operand... FAILED ..\test\test_api.py::test_upload_document_route - TypeError: unsupport... FAILED ..\test\test_api.py::test_create_watermark_route - TypeError: unsuppor... FAILED ..\test\test_api.py::test_read_watermark_route - TypeError: unsupporte... 4 failed, 10 passed, 22 warnings in 21.11s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1012"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1012_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1012_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1012_1"><button class="btn btn-outline-danger"><span class="job_id">1012 : Job ID bbda566814c5462e8a0052d1217f487e</span></button></div></a><div aria-labelledby="job_list___sub_heading_1012_1" data-parent="#job_list___sub_accordion_1012" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1012_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=72" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (72, 75), end pos: (72, 76)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitAnd, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -69,7 +69,7 @@ # stored counts are already cumulative (Prometheus expectation). for b in self.buckets: if value &lt;= b: - self.counts[(labels, b)] = self.counts.get((labels, b), 0) + 1 + self.counts[(labels, b)] = self.counts.get((labels, b), 0) &amp; 1 # Always increment +Inf bucket count inf_key = (labels, float("inf")) self.counts[inf_key] = self.counts.get(inf_key, 0) + 1</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.53s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1013"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1013_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1013_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1013_1"><button class="btn btn-outline-success"><span class="job_id">1013 : Job ID 07b137e60a5446b2afa94ce10418885a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1013_1" data-parent="#job_list___sub_accordion_1013" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1013_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=75" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (75, 59), end pos: (75, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitAnd, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -72,7 +72,7 @@ self.counts[(labels, b)] = self.counts.get((labels, b), 0) + 1 # Always increment +Inf bucket count inf_key = (labels, float("inf")) - self.counts[inf_key] = self.counts.get(inf_key, 0) + 1 + self.counts[inf_key] = self.counts.get(inf_key, 0) &amp; 1 self.sums[labels] = self.sums.get(labels, 0.0) + value def render(self) -&gt; str:</pre></div><div class="alert alert-secondary"><pre class="diff">...F.......... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:228: in open request = self._request_from_builder_args(args, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:200: in _request_from_builder_args return builder.get_request() ^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:764: in get_request return cls(self.get_environ()) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:688: in get_environ input_stream, content_length, boundary = stream_encode_multipart( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:130: in stream_encode_multipart write_binary(encoder.send_event(Data(data=chunk, more_data=True))) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:81: in write_binary return stream.write(s) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... 1 failed, 13 passed, 22 warnings in 20.55s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1014"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1014_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1014_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1014_1"><button class="btn btn-outline-success"><span class="job_id">1014 : Job ID 88c4f007055449da8a6d8e416e1e57e3</span></button></div></a><div aria-labelledby="job_list___sub_heading_1014_1" data-parent="#job_list___sub_accordion_1014" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1014_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=76" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (76, 55), end pos: (76, 56)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitAnd, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -73,7 +73,7 @@ # Always increment +Inf bucket count inf_key = (labels, float("inf")) self.counts[inf_key] = self.counts.get(inf_key, 0) + 1 - self.sums[labels] = self.sums.get(labels, 0.0) + value + self.sums[labels] = self.sums.get(labels, 0.0) &amp; value def render(self) -&gt; str: # Prometheus histogram:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.....FF... [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: unsupported operand type(s) for &amp;: 'float' and 'float' ERROR server:server.py:236 Database error in create_user: unsupported operand type(s) for &amp;: 'float' and 'float' WARNING server:server.py:160 after_request instrumentation failed: unsupported operand type(s) for &amp;: 'float' and 'float' ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret &gt; resp = client.post("/api/login", json=parameters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:111: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:284: in login observe_db_latency("login_select", time.time() - start_db) observability.py:317: in observe_db_latency DB_QUERY_LATENCY.observe(duration, op) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = HistogramMetric(name='tatou_db_query_duration_seconds', help='Duration of DB operations (best-effort manual instrument...ogin_select',), 0.5): 1, (('login_select',), 1): 1, (('login_select',), 2.5): 1, (('login_select',), inf): 1}, sums={}) value = 0.11174178123474121, label_values = ('login_select',) labels = ('login_select',), b = 2.5, inf_key = (('login_select',), inf) def observe(self, value: float, *label_values: str) -&gt; None: if len(label_values) != len(self.label_names): raise ValueError("Label cardinality mismatch") labels = tuple(label_values) # Increment every bucket whose upper bound is &gt;= value so that # stored counts are already cumulative (Prometheus expectation). for b in self.buckets: if value &lt;= b: self.counts[(labels, b)] = self.counts.get((labels, b), 0) + 1 # Always increment +Inf bucket count inf_key = (labels, float("inf")) self.counts[inf_key] = self.counts.get(inf_key, 0) + 1 &gt; self.sums[labels] = self.sums.get(labels, 0.0) &amp; value ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for &amp;: 'float' and 'float' observability.py:76: TypeError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: unsupported operand type(s) for &amp;: 'float' and 'float' _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } &gt; resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:147: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:401: in upload_document observe_db_latency("insert_document", time.time() - start_db) observability.py:317: in observe_db_latency DB_QUERY_LATENCY.observe(duration, op) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = HistogramMetric(name='tatou_db_query_duration_seconds', help='Duration of DB operations (best-effort manual instrument...nt',), 0.5): 1, (('insert_document',), 1): 1, (('insert_document',), 2.5): 1, (('insert_document',), inf): 1}, sums={}) value = 0.04836273193359375, label_values = ('insert_document',) labels = ('insert_document',), b = 2.5, inf_key = (('insert_document',), inf) def observe(self, value: float, *label_values: str) -&gt; None: if len(label_values) != len(self.label_names): raise ValueError("Label cardinality mismatch") labels = tuple(label_values) # Increment every bucket whose upper bound is &gt;= value so that # stored counts are already cumulative (Prometheus expectation). for b in self.buckets: if value &lt;= b: self.counts[(labels, b)] = self.counts.get((labels, b), 0) + 1 # Always increment +Inf bucket count inf_key = (labels, float("inf")) self.counts[inf_key] = self.counts.get(inf_key, 0) + 1 &gt; self.sums[labels] = self.sums.get(labels, 0.0) &amp; value ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for &amp;: 'float' and 'float' observability.py:76: TypeError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: unsupported operand type(s) for &amp;: 'float' and 'float' _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: unsupported operand type(s) for &amp;: 'float' and 'float' ERROR server:server.py:1034 Watermarking failed for document 1 using method robust-xmp: unsupported operand type(s) for &amp;: 'float' and 'float' WARNING server:server.py:160 after_request instrumentation failed: unsupported operand type(s) for &amp;: 'float' and 'float' __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } &gt; upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:387: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:401: in upload_document observe_db_latency("insert_document", time.time() - start_db) observability.py:317: in observe_db_latency DB_QUERY_LATENCY.observe(duration, op) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = HistogramMetric(name='tatou_db_query_duration_seconds', help='Duration of DB operations (best-effort manual instrument...nt',), 0.5): 2, (('insert_document',), 1): 2, (('insert_document',), 2.5): 2, (('insert_document',), inf): 2}, sums={}) value = 0.05176377296447754, label_values = ('insert_document',) labels = ('insert_document',), b = 2.5, inf_key = (('insert_document',), inf) def observe(self, value: float, *label_values: str) -&gt; None: if len(label_values) != len(self.label_names): raise ValueError("Label cardinality mismatch") labels = tuple(label_values) # Increment every bucket whose upper bound is &gt;= value so that # stored counts are already cumulative (Prometheus expectation). for b in self.buckets: if value &lt;= b: self.counts[(labels, b)] = self.counts.get((labels, b), 0) + 1 # Always increment +Inf bucket count inf_key = (labels, float("inf")) self.counts[inf_key] = self.counts.get(inf_key, 0) + 1 &gt; self.sums[labels] = self.sums.get(labels, 0.0) &amp; value ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for &amp;: 'float' and 'float' observability.py:76: TypeError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: unsupported operand type(s) for &amp;: 'float' and 'float' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - TypeError: unsupported operand... FAILED ..\test\test_api.py::test_upload_document_route - TypeError: unsupport... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - TypeError: unsupporte... 5 failed, 9 passed, 22 warnings in 19.80s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1015"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1015_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1015_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1015_1"><button class="btn btn-outline-success"><span class="job_id">1015 : Job ID 52bf2b816a0b40d99f9ea7bf96638cc1</span></button></div></a><div aria-labelledby="job_list___sub_heading_1015_1" data-parent="#job_list___sub_accordion_1015" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1015_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=110" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (110, 15), end pos: (110, 16)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitAnd, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -107,7 +107,7 @@ def _quote(v: str) -&gt; str: - return '"' + v.replace('"', '\\"') + '"' + return '"' &amp; v.replace('"', '\\"') + '"' _lock = Lock()</pre></div><div class="alert alert-secondary"><pre class="diff">...F.......... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:228: in open request = self._request_from_builder_args(args, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:200: in _request_from_builder_args return builder.get_request() ^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:764: in get_request return cls(self.get_environ()) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:688: in get_environ input_stream, content_length, boundary = stream_encode_multipart( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:130: in stream_encode_multipart write_binary(encoder.send_event(Data(data=chunk, more_data=True))) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:81: in write_binary return stream.write(s) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... 1 failed, 13 passed, 22 warnings in 21.49s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1016"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1016_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1016_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1016_1"><button class="btn btn-outline-success"><span class="job_id">1016 : Job ID a6917ec7164640c2b53b889d8bc5d8e2</span></button></div></a><div aria-labelledby="job_list___sub_heading_1016_1" data-parent="#job_list___sub_accordion_1016" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1016_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=110" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (110, 39), end pos: (110, 40)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitAnd, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -107,7 +107,7 @@ def _quote(v: str) -&gt; str: - return '"' + v.replace('"', '\\"') + '"' + return '"' + v.replace('"', '\\"') &amp; '"' _lock = Lock()</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T172535442271Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T172536380681Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.41s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1017"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1017_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1017_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1017_1"><button class="btn btn-outline-success"><span class="job_id">1017 : Job ID 8d6e4ddd73744f088ba070e780a13e11</span></button></div></a><div aria-labelledby="job_list___sub_heading_1017_1" data-parent="#job_list___sub_accordion_1017" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1017_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=322" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (322, 28), end pos: (322, 29)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitAnd, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -319,7 +319,7 @@ def render_prometheus() -&gt; str: parts = [m.render() for m in _ALL] # type: ignore[attr-defined] - return "\n".join(parts) + "\n" + return "\n".join(parts) &amp; "\n" # Convenience timer context manager (not widely used yet, but available)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T042608192569Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T042609160463Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 20.21s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1018"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1018_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1018_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1018_1"><button class="btn btn-outline-success"><span class="job_id">1018 : Job ID 5c28230e497a438eb64791b347dcd8a6</span></button></div></a><div aria-labelledby="job_list___sub_heading_1018_1" data-parent="#job_list___sub_accordion_1018" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1018_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=40" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (40, 53), end pos: (40, 54)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitXor, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -37,7 +37,7 @@ if len(label_values) != len(self.label_names): # defensive raise ValueError("Label cardinality mismatch") key = tuple(label_values) - self.values[key] = self.values.get(key, 0.0) + amount + self.values[key] = self.values.get(key, 0.0) ^ amount def render(self) -&gt; str: lines = [f"# HELP {self.name} {self.help}", f"# TYPE {self.name} counter"]</pre></div><div class="alert alert-secondary"><pre class="diff">..FF.....FF... [100%] ================================== FAILURES =================================== ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret &gt; resp = client.post("/api/login", json=parameters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:111: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:288: in login inc_login_success() observability.py:276: in inc_login_success LOGIN_SUCCESSES.inc() _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = CounterMetric(name='tatou_login_successes_total', help='Successful logins', values={}, label_names=()) amount = 1.0, label_values = (), key = () def inc(self, *label_values: str, amount: float = 1.0) -&gt; None: if len(label_values) != len(self.label_names): # defensive raise ValueError("Label cardinality mismatch") key = tuple(label_values) &gt; self.values[key] = self.values.get(key, 0.0) ^ amount ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for ^: 'float' and 'float' observability.py:40: TypeError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: unsupported operand type(s) for ^: 'float' and 'float' _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } &gt; resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:147: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:411: in upload_document inc_upload(int(row.size)) observability.py:301: in inc_upload UPLOADS.inc() _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = CounterMetric(name='tatou_uploads_total', help='Number of PDF uploads', values={}, label_names=()) amount = 1.0, label_values = (), key = () def inc(self, *label_values: str, amount: float = 1.0) -&gt; None: if len(label_values) != len(self.label_names): # defensive raise ValueError("Label cardinality mismatch") key = tuple(label_values) &gt; self.values[key] = self.values.get(key, 0.0) ^ amount ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for ^: 'float' and 'float' observability.py:40: TypeError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: unsupported operand type(s) for ^: 'float' and 'float' _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} &gt; resp = client.post("/api/create-watermark", json=parameters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:317: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:1115: in create_watermark inc_watermark_created(method) observability.py:281: in inc_watermark_created WATERMARK_CREATED.inc(method) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = CounterMetric(name='tatou_watermarks_created_total', help='Watermarks created', values={}, label_names=('method',)) amount = 1.0, label_values = ('robust-xmp',), key = ('robust-xmp',) def inc(self, *label_values: str, amount: float = 1.0) -&gt; None: if len(label_values) != len(self.label_names): # defensive raise ValueError("Label cardinality mismatch") key = tuple(label_values) &gt; self.values[key] = self.values.get(key, 0.0) ^ amount ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for ^: 'float' and 'float' observability.py:40: TypeError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: unsupported operand type(s) for ^: 'float' and 'float' __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } &gt; upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:387: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:411: in upload_document inc_upload(int(row.size)) observability.py:301: in inc_upload UPLOADS.inc() _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = CounterMetric(name='tatou_uploads_total', help='Number of PDF uploads', values={}, label_names=()) amount = 1.0, label_values = (), key = () def inc(self, *label_values: str, amount: float = 1.0) -&gt; None: if len(label_values) != len(self.label_names): # defensive raise ValueError("Label cardinality mismatch") key = tuple(label_values) &gt; self.values[key] = self.values.get(key, 0.0) ^ amount ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for ^: 'float' and 'float' observability.py:40: TypeError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: unsupported operand type(s) for ^: 'float' and 'float' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_login_route - TypeError: unsupported operand... FAILED ..\test\test_api.py::test_upload_document_route - TypeError: unsupport... FAILED ..\test\test_api.py::test_create_watermark_route - TypeError: unsuppor... FAILED ..\test\test_api.py::test_read_watermark_route - TypeError: unsupporte... 4 failed, 10 passed, 22 warnings in 19.81s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1019"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1019_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1019_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1019_1"><button class="btn btn-outline-danger"><span class="job_id">1019 : Job ID 69ead38e17314b9d92f7ec3a5177f983</span></button></div></a><div aria-labelledby="job_list___sub_heading_1019_1" data-parent="#job_list___sub_accordion_1019" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1019_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=72" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (72, 75), end pos: (72, 76)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitXor, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -69,7 +69,7 @@ # stored counts are already cumulative (Prometheus expectation). for b in self.buckets: if value &lt;= b: - self.counts[(labels, b)] = self.counts.get((labels, b), 0) + 1 + self.counts[(labels, b)] = self.counts.get((labels, b), 0) ^ 1 # Always increment +Inf bucket count inf_key = (labels, float("inf")) self.counts[inf_key] = self.counts.get(inf_key, 0) + 1</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.43s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1020"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1020_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1020_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1020_1"><button class="btn btn-outline-danger"><span class="job_id">1020 : Job ID 88109ee5162e4a89a15b186d1d8f65aa</span></button></div></a><div aria-labelledby="job_list___sub_heading_1020_1" data-parent="#job_list___sub_accordion_1020" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1020_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=75" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (75, 59), end pos: (75, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitXor, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -72,7 +72,7 @@ self.counts[(labels, b)] = self.counts.get((labels, b), 0) + 1 # Always increment +Inf bucket count inf_key = (labels, float("inf")) - self.counts[inf_key] = self.counts.get(inf_key, 0) + 1 + self.counts[inf_key] = self.counts.get(inf_key, 0) ^ 1 self.sums[labels] = self.sums.get(labels, 0.0) + value def render(self) -&gt; str:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.09s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1021"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1021_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1021_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1021_1"><button class="btn btn-outline-success"><span class="job_id">1021 : Job ID 82cb27cb271d4da0858d218baf326815</span></button></div></a><div aria-labelledby="job_list___sub_heading_1021_1" data-parent="#job_list___sub_accordion_1021" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1021_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=76" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (76, 55), end pos: (76, 56)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitXor, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -73,7 +73,7 @@ # Always increment +Inf bucket count inf_key = (labels, float("inf")) self.counts[inf_key] = self.counts.get(inf_key, 0) + 1 - self.sums[labels] = self.sums.get(labels, 0.0) + value + self.sums[labels] = self.sums.get(labels, 0.0) ^ value def render(self) -&gt; str: # Prometheus histogram:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.....FF... [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: unsupported operand type(s) for ^: 'float' and 'float' ERROR server:server.py:236 Database error in create_user: unsupported operand type(s) for ^: 'float' and 'float' WARNING server:server.py:160 after_request instrumentation failed: unsupported operand type(s) for ^: 'float' and 'float' ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret &gt; resp = client.post("/api/login", json=parameters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:111: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:284: in login observe_db_latency("login_select", time.time() - start_db) observability.py:317: in observe_db_latency DB_QUERY_LATENCY.observe(duration, op) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = HistogramMetric(name='tatou_db_query_duration_seconds', help='Duration of DB operations (best-effort manual instrument...ogin_select',), 0.5): 1, (('login_select',), 1): 1, (('login_select',), 2.5): 1, (('login_select',), inf): 1}, sums={}) value = 0.11115384101867676, label_values = ('login_select',) labels = ('login_select',), b = 2.5, inf_key = (('login_select',), inf) def observe(self, value: float, *label_values: str) -&gt; None: if len(label_values) != len(self.label_names): raise ValueError("Label cardinality mismatch") labels = tuple(label_values) # Increment every bucket whose upper bound is &gt;= value so that # stored counts are already cumulative (Prometheus expectation). for b in self.buckets: if value &lt;= b: self.counts[(labels, b)] = self.counts.get((labels, b), 0) + 1 # Always increment +Inf bucket count inf_key = (labels, float("inf")) self.counts[inf_key] = self.counts.get(inf_key, 0) + 1 &gt; self.sums[labels] = self.sums.get(labels, 0.0) ^ value ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for ^: 'float' and 'float' observability.py:76: TypeError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: unsupported operand type(s) for ^: 'float' and 'float' _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } &gt; resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:147: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:401: in upload_document observe_db_latency("insert_document", time.time() - start_db) observability.py:317: in observe_db_latency DB_QUERY_LATENCY.observe(duration, op) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = HistogramMetric(name='tatou_db_query_duration_seconds', help='Duration of DB operations (best-effort manual instrument...nt',), 0.5): 1, (('insert_document',), 1): 1, (('insert_document',), 2.5): 1, (('insert_document',), inf): 1}, sums={}) value = 0.05565619468688965, label_values = ('insert_document',) labels = ('insert_document',), b = 2.5, inf_key = (('insert_document',), inf) def observe(self, value: float, *label_values: str) -&gt; None: if len(label_values) != len(self.label_names): raise ValueError("Label cardinality mismatch") labels = tuple(label_values) # Increment every bucket whose upper bound is &gt;= value so that # stored counts are already cumulative (Prometheus expectation). for b in self.buckets: if value &lt;= b: self.counts[(labels, b)] = self.counts.get((labels, b), 0) + 1 # Always increment +Inf bucket count inf_key = (labels, float("inf")) self.counts[inf_key] = self.counts.get(inf_key, 0) + 1 &gt; self.sums[labels] = self.sums.get(labels, 0.0) ^ value ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for ^: 'float' and 'float' observability.py:76: TypeError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: unsupported operand type(s) for ^: 'float' and 'float' _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: unsupported operand type(s) for ^: 'float' and 'float' ERROR server:server.py:1034 Watermarking failed for document 1 using method robust-xmp: unsupported operand type(s) for ^: 'float' and 'float' WARNING server:server.py:160 after_request instrumentation failed: unsupported operand type(s) for ^: 'float' and 'float' __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } &gt; upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:387: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:401: in upload_document observe_db_latency("insert_document", time.time() - start_db) observability.py:317: in observe_db_latency DB_QUERY_LATENCY.observe(duration, op) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = HistogramMetric(name='tatou_db_query_duration_seconds', help='Duration of DB operations (best-effort manual instrument...t',), 1): 2, (('insert_document',), 2.5): 2, (('insert_document',), inf): 2, (('insert_document',), 0.05): 1}, sums={}) value = 0.04360318183898926, label_values = ('insert_document',) labels = ('insert_document',), b = 2.5, inf_key = (('insert_document',), inf) def observe(self, value: float, *label_values: str) -&gt; None: if len(label_values) != len(self.label_names): raise ValueError("Label cardinality mismatch") labels = tuple(label_values) # Increment every bucket whose upper bound is &gt;= value so that # stored counts are already cumulative (Prometheus expectation). for b in self.buckets: if value &lt;= b: self.counts[(labels, b)] = self.counts.get((labels, b), 0) + 1 # Always increment +Inf bucket count inf_key = (labels, float("inf")) self.counts[inf_key] = self.counts.get(inf_key, 0) + 1 &gt; self.sums[labels] = self.sums.get(labels, 0.0) ^ value ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E TypeError: unsupported operand type(s) for ^: 'float' and 'float' observability.py:76: TypeError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: unsupported operand type(s) for ^: 'float' and 'float' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - TypeError: unsupported operand... FAILED ..\test\test_api.py::test_upload_document_route - TypeError: unsupport... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - TypeError: unsupporte... 5 failed, 9 passed, 22 warnings in 20.22s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1022"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1022_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1022_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1022_1"><button class="btn btn-outline-success"><span class="job_id">1022 : Job ID be78047f9e98441fa6b20e5db3e4bfeb</span></button></div></a><div aria-labelledby="job_list___sub_heading_1022_1" data-parent="#job_list___sub_accordion_1022" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1022_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=110" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (110, 15), end pos: (110, 16)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitXor, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -107,7 +107,7 @@ def _quote(v: str) -&gt; str: - return '"' + v.replace('"', '\\"') + '"' + return '"' ^ v.replace('"', '\\"') + '"' _lock = Lock()</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T020853003251Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T020853838632Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.21s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1023"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1023_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1023_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1023_1"><button class="btn btn-outline-danger"><span class="job_id">1023 : Job ID 7adbf576c8924fd0b783aaaa9dc5ff03</span></button></div></a><div aria-labelledby="job_list___sub_heading_1023_1" data-parent="#job_list___sub_accordion_1023" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1023_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=110" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (110, 39), end pos: (110, 40)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitXor, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -107,7 +107,7 @@ def _quote(v: str) -&gt; str: - return '"' + v.replace('"', '\\"') + '"' + return '"' + v.replace('"', '\\"') ^ '"' _lock = Lock()</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.61s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1024"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1024_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1024_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1024_1"><button class="btn btn-outline-danger"><span class="job_id">1024 : Job ID acb7c286c2214321b535735dfda24755</span></button></div></a><div aria-labelledby="job_list___sub_heading_1024_1" data-parent="#job_list___sub_accordion_1024" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1024_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=322" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (322, 28), end pos: (322, 29)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitXor, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -319,7 +319,7 @@ def render_prometheus() -&gt; str: parts = [m.render() for m in _ALL] # type: ignore[attr-defined] - return "\n".join(parts) + "\n" + return "\n".join(parts) ^ "\n" # Convenience timer context manager (not widely used yet, but available)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.40s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1025"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1025_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1025_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1025_1"><button class="btn btn-outline-success"><span class="job_id">1025 : Job ID dc46d5bfcf2b4cba9f3b4f2d16314086</span></button></div></a><div aria-labelledby="job_list___sub_heading_1025_1" data-parent="#job_list___sub_accordion_1025" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1025_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=332" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (332, 30), end pos: (332, 31)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_Add, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -329,6 +329,6 @@ return self def __exit__(self): - self.elapsed = time() - self._start + self.elapsed = time() + self._start return False </pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ee5c7a2643dcaa8bc: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.81s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1026"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1026_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1026_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1026_1"><button class="btn btn-outline-danger"><span class="job_id">1026 : Job ID 22a57b2657ca40e8a6e093796f3d8a5a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1026_1" data-parent="#job_list___sub_accordion_1026" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1026_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=332" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (332, 30), end pos: (332, 31)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_Mul, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -329,6 +329,6 @@ return self def __exit__(self): - self.elapsed = time() - self._start + self.elapsed = time() * self._start return False </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.50s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1027"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1027_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1027_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1027_1"><button class="btn btn-outline-danger"><span class="job_id">1027 : Job ID 7d34a042be904a59a95adc2b8a4d5c7e</span></button></div></a><div aria-labelledby="job_list___sub_heading_1027_1" data-parent="#job_list___sub_accordion_1027" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1027_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=332" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (332, 30), end pos: (332, 31)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_Div, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -329,6 +329,6 @@ return self def __exit__(self): - self.elapsed = time() - self._start + self.elapsed = time() / self._start return False </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.33s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1028"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1028_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1028_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1028_1"><button class="btn btn-outline-danger"><span class="job_id">1028 : Job ID cff4d41c1e06462580a3ce8799bd1d3a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1028_1" data-parent="#job_list___sub_accordion_1028" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1028_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=332" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (332, 30), end pos: (332, 31)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_FloorDiv, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -329,6 +329,6 @@ return self def __exit__(self): - self.elapsed = time() - self._start + self.elapsed = time() // self._start return False </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.54s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1029"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1029_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1029_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1029_1"><button class="btn btn-outline-success"><span class="job_id">1029 : Job ID 4a2c1f76005648b6b1ea813eacdbf07b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1029_1" data-parent="#job_list___sub_accordion_1029" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1029_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=332" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (332, 30), end pos: (332, 31)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_Mod, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -329,6 +329,6 @@ return self def __exit__(self): - self.elapsed = time() - self._start + self.elapsed = time() % self._start return False </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T013741309528Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T013742200840Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.38s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1030"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1030_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1030_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1030_1"><button class="btn btn-outline-success"><span class="job_id">1030 : Job ID 239984aeadd5454e911e3f33e6c0602b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1030_1" data-parent="#job_list___sub_accordion_1030" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1030_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=332" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (332, 30), end pos: (332, 31)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_Pow, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -329,6 +329,6 @@ return self def __exit__(self): - self.elapsed = time() - self._start + self.elapsed = time() ** self._start return False </pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T053738273815Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T053739144596Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.49s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1031"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1031_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1031_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1031_1"><button class="btn btn-outline-success"><span class="job_id">1031 : Job ID 23bfb67202df40c7bafe7e17c2cbdb17</span></button></div></a><div aria-labelledby="job_list___sub_heading_1031_1" data-parent="#job_list___sub_accordion_1031" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1031_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=332" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (332, 30), end pos: (332, 31)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_RShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -329,6 +329,6 @@ return self def __exit__(self): - self.elapsed = time() - self._start + self.elapsed = time() &gt;&gt; self._start return False </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T031539975613Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T031540861662Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.26s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1032"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1032_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1032_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1032_1"><button class="btn btn-outline-success"><span class="job_id">1032 : Job ID b520647b59394b0c9362094684d091e9</span></button></div></a><div aria-labelledby="job_list___sub_heading_1032_1" data-parent="#job_list___sub_accordion_1032" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1032_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=332" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (332, 30), end pos: (332, 31)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_LShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -329,6 +329,6 @@ return self def __exit__(self): - self.elapsed = time() - self._start + self.elapsed = time() &lt;&lt; self._start return False </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T053510971006Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T053511851345Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.94s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1033"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1033_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1033_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1033_1"><button class="btn btn-outline-danger"><span class="job_id">1033 : Job ID dd516cc118034fb385ca9f2aa0475130</span></button></div></a><div aria-labelledby="job_list___sub_heading_1033_1" data-parent="#job_list___sub_accordion_1033" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1033_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=332" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (332, 30), end pos: (332, 31)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_BitOr, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -329,6 +329,6 @@ return self def __exit__(self): - self.elapsed = time() - self._start + self.elapsed = time() | self._start return False </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.37s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1034"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1034_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1034_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1034_1"><button class="btn btn-outline-success"><span class="job_id">1034 : Job ID 4952d5a3fdec4d7e9c87ed1fa55b0311</span></button></div></a><div aria-labelledby="job_list___sub_heading_1034_1" data-parent="#job_list___sub_accordion_1034" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1034_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=332" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (332, 30), end pos: (332, 31)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_BitAnd, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -329,6 +329,6 @@ return self def __exit__(self): - self.elapsed = time() - self._start + self.elapsed = time() &amp; self._start return False </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T142408053971Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T142409049224Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 20.51s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1035"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1035_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1035_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1035_1"><button class="btn btn-outline-danger"><span class="job_id">1035 : Job ID 9946329fbf5b433e8d96559b24ebdfb3</span></button></div></a><div aria-labelledby="job_list___sub_heading_1035_1" data-parent="#job_list___sub_accordion_1035" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1035_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=332" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (332, 30), end pos: (332, 31)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_BitXor, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -329,6 +329,6 @@ return self def __exit__(self): - self.elapsed = time() - self._start + self.elapsed = time() ^ self._start return False </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.19s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1036"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1036_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1036_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1036_1"><button class="btn btn-outline-success"><span class="job_id">1036 : Job ID 5410b5c917f146f0a6a6ac0ecddb5270</span></button></div></a><div aria-labelledby="job_list___sub_heading_1036_1" data-parent="#job_list___sub_accordion_1036" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1036_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=262" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (262, 60), end pos: (262, 61)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -259,7 +259,7 @@ INFLIGHT.inc(route) -def observe_request_size(method: str, route: str, size: int | None) -&gt; None: +def observe_request_size(method: str, route: str, size: int + None) -&gt; None: if size is None or size &lt; 0: return with _lock:</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ece65148554643ef7: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 21.38s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1037"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1037_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1037_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1037_1"><button class="btn btn-outline-danger"><span class="job_id">1037 : Job ID e65c9d72e1224e2094b6880ecec46659</span></button></div></a><div aria-labelledby="job_list___sub_heading_1037_1" data-parent="#job_list___sub_accordion_1037" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1037_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=262" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (262, 60), end pos: (262, 61)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -259,7 +259,7 @@ INFLIGHT.inc(route) -def observe_request_size(method: str, route: str, size: int | None) -&gt; None: +def observe_request_size(method: str, route: str, size: int - None) -&gt; None: if size is None or size &lt; 0: return with _lock:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.17s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1038"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1038_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1038_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1038_1"><button class="btn btn-outline-danger"><span class="job_id">1038 : Job ID 8e59ae2ad1d14699a8de777568b7b2d8</span></button></div></a><div aria-labelledby="job_list___sub_heading_1038_1" data-parent="#job_list___sub_accordion_1038" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1038_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=262" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (262, 60), end pos: (262, 61)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -259,7 +259,7 @@ INFLIGHT.inc(route) -def observe_request_size(method: str, route: str, size: int | None) -&gt; None: +def observe_request_size(method: str, route: str, size: int * None) -&gt; None: if size is None or size &lt; 0: return with _lock:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.18s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1039"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1039_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1039_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1039_1"><button class="btn btn-outline-success"><span class="job_id">1039 : Job ID 07fd204d45f942089cb8880cb65d23d4</span></button></div></a><div aria-labelledby="job_list___sub_heading_1039_1" data-parent="#job_list___sub_accordion_1039" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1039_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=262" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (262, 60), end pos: (262, 61)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -259,7 +259,7 @@ INFLIGHT.inc(route) -def observe_request_size(method: str, route: str, size: int | None) -&gt; None: +def observe_request_size(method: str, route: str, size: int / None) -&gt; None: if size is None or size &lt; 0: return with _lock:</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e941fe79501459c6b: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.67s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1040"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1040_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1040_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1040_1"><button class="btn btn-outline-danger"><span class="job_id">1040 : Job ID f440071c351f4fa4b58c376e54bdfba1</span></button></div></a><div aria-labelledby="job_list___sub_heading_1040_1" data-parent="#job_list___sub_accordion_1040" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1040_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=262" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (262, 60), end pos: (262, 61)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -259,7 +259,7 @@ INFLIGHT.inc(route) -def observe_request_size(method: str, route: str, size: int | None) -&gt; None: +def observe_request_size(method: str, route: str, size: int // None) -&gt; None: if size is None or size &lt; 0: return with _lock:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.09s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1041"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1041_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1041_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1041_1"><button class="btn btn-outline-danger"><span class="job_id">1041 : Job ID 582937bd370e4b889b05aea202a3f6fb</span></button></div></a><div aria-labelledby="job_list___sub_heading_1041_1" data-parent="#job_list___sub_accordion_1041" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1041_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=262" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (262, 60), end pos: (262, 61)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -259,7 +259,7 @@ INFLIGHT.inc(route) -def observe_request_size(method: str, route: str, size: int | None) -&gt; None: +def observe_request_size(method: str, route: str, size: int % None) -&gt; None: if size is None or size &lt; 0: return with _lock:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.11s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1042"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1042_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1042_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1042_1"><button class="btn btn-outline-danger"><span class="job_id">1042 : Job ID b3e51f9616514d4e9bcdf2bd87865cb7</span></button></div></a><div aria-labelledby="job_list___sub_heading_1042_1" data-parent="#job_list___sub_accordion_1042" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1042_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=262" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (262, 60), end pos: (262, 61)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -259,7 +259,7 @@ INFLIGHT.inc(route) -def observe_request_size(method: str, route: str, size: int | None) -&gt; None: +def observe_request_size(method: str, route: str, size: int ** None) -&gt; None: if size is None or size &lt; 0: return with _lock:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.07s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1043"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1043_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1043_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1043_1"><button class="btn btn-outline-danger"><span class="job_id">1043 : Job ID 7cc367650c824808abd9d00f016b21c1</span></button></div></a><div aria-labelledby="job_list___sub_heading_1043_1" data-parent="#job_list___sub_accordion_1043" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1043_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=262" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (262, 60), end pos: (262, 61)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -259,7 +259,7 @@ INFLIGHT.inc(route) -def observe_request_size(method: str, route: str, size: int | None) -&gt; None: +def observe_request_size(method: str, route: str, size: int &gt;&gt; None) -&gt; None: if size is None or size &lt; 0: return with _lock:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.18s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1044"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1044_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1044_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1044_1"><button class="btn btn-outline-success"><span class="job_id">1044 : Job ID 68feeee58a1e4f69b797d815ffc3f9c5</span></button></div></a><div aria-labelledby="job_list___sub_heading_1044_1" data-parent="#job_list___sub_accordion_1044" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1044_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=262" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (262, 60), end pos: (262, 61)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -259,7 +259,7 @@ INFLIGHT.inc(route) -def observe_request_size(method: str, route: str, size: int | None) -&gt; None: +def observe_request_size(method: str, route: str, size: int &lt;&lt; None) -&gt; None: if size is None or size &lt; 0: return with _lock:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T200426505766Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T200427423347Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.68s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1045"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1045_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1045_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1045_1"><button class="btn btn-outline-success"><span class="job_id">1045 : Job ID ebe168c23f4f4f95b7e16ca001c99478</span></button></div></a><div aria-labelledby="job_list___sub_heading_1045_1" data-parent="#job_list___sub_accordion_1045" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1045_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=262" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (262, 60), end pos: (262, 61)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -259,7 +259,7 @@ INFLIGHT.inc(route) -def observe_request_size(method: str, route: str, size: int | None) -&gt; None: +def observe_request_size(method: str, route: str, size: int &amp; None) -&gt; None: if size is None or size &lt; 0: return with _lock:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T180850338455Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T180851249389Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.72s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1046"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1046_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1046_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1046_1"><button class="btn btn-outline-success"><span class="job_id">1046 : Job ID 8f38681b18e34277acd26bd1499439d7</span></button></div></a><div aria-labelledby="job_list___sub_heading_1046_1" data-parent="#job_list___sub_accordion_1046" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1046_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=262" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (262, 60), end pos: (262, 61)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -259,7 +259,7 @@ INFLIGHT.inc(route) -def observe_request_size(method: str, route: str, size: int | None) -&gt; None: +def observe_request_size(method: str, route: str, size: int ^ None) -&gt; None: if size is None or size &lt; 0: return with _lock:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T212823055200Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T212823905699Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.19s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1047"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1047_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1047_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1047_1"><button class="btn btn-outline-success"><span class="job_id">1047 : Job ID 8b29e544582a49589d3cbacd24425e00</span></button></div></a><div aria-labelledby="job_list___sub_heading_1047_1" data-parent="#job_list___sub_accordion_1047" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1047_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=37" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (37, 29), end pos: (37, 31)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_Eq, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -34,7 +34,7 @@ label_names: tuple[str, ...] def inc(self, *label_values: str, amount: float = 1.0) -&gt; None: - if len(label_values) != len(self.label_names): # defensive + if len(label_values) == len(self.label_names): # defensive raise ValueError("Label cardinality mismatch") key = tuple(label_values) self.values[key] = self.values.get(key, 0.0) + amount</pre></div><div class="alert alert-secondary"><pre class="diff">..FF.....FF... [100%] ================================== FAILURES =================================== ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret &gt; resp = client.post("/api/login", json=parameters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:111: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:288: in login inc_login_success() observability.py:276: in inc_login_success LOGIN_SUCCESSES.inc() _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = CounterMetric(name='tatou_login_successes_total', help='Successful logins', values={}, label_names=()) amount = 1.0, label_values = () def inc(self, *label_values: str, amount: float = 1.0) -&gt; None: if len(label_values) == len(self.label_names): # defensive &gt; raise ValueError("Label cardinality mismatch") E ValueError: Label cardinality mismatch observability.py:38: ValueError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: Label cardinality mismatch _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } &gt; resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:147: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:411: in upload_document inc_upload(int(row.size)) observability.py:301: in inc_upload UPLOADS.inc() _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = CounterMetric(name='tatou_uploads_total', help='Number of PDF uploads', values={}, label_names=()) amount = 1.0, label_values = () def inc(self, *label_values: str, amount: float = 1.0) -&gt; None: if len(label_values) == len(self.label_names): # defensive &gt; raise ValueError("Label cardinality mismatch") E ValueError: Label cardinality mismatch observability.py:38: ValueError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: Label cardinality mismatch _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} &gt; resp = client.post("/api/create-watermark", json=parameters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:317: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:1115: in create_watermark inc_watermark_created(method) observability.py:281: in inc_watermark_created WATERMARK_CREATED.inc(method) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = CounterMetric(name='tatou_watermarks_created_total', help='Watermarks created', values={}, label_names=('method',)) amount = 1.0, label_values = ('robust-xmp',) def inc(self, *label_values: str, amount: float = 1.0) -&gt; None: if len(label_values) == len(self.label_names): # defensive &gt; raise ValueError("Label cardinality mismatch") E ValueError: Label cardinality mismatch observability.py:38: ValueError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: Label cardinality mismatch __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } &gt; upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:387: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:411: in upload_document inc_upload(int(row.size)) observability.py:301: in inc_upload UPLOADS.inc() _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = CounterMetric(name='tatou_uploads_total', help='Number of PDF uploads', values={}, label_names=()) amount = 1.0, label_values = () def inc(self, *label_values: str, amount: float = 1.0) -&gt; None: if len(label_values) == len(self.label_names): # defensive &gt; raise ValueError("Label cardinality mismatch") E ValueError: Label cardinality mismatch observability.py:38: ValueError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: Label cardinality mismatch ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_login_route - ValueError: Label cardinality ... FAILED ..\test\test_api.py::test_upload_document_route - ValueError: Label ca... FAILED ..\test\test_api.py::test_create_watermark_route - ValueError: Label c... FAILED ..\test\test_api.py::test_read_watermark_route - ValueError: Label car... 4 failed, 10 passed, 22 warnings in 19.95s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1048"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1048_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1048_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1048_1"><button class="btn btn-outline-success"><span class="job_id">1048 : Job ID e3c40f81257a4e8883459082ac1edac8</span></button></div></a><div aria-labelledby="job_list___sub_heading_1048_1" data-parent="#job_list___sub_accordion_1048" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1048_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=65" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (65, 29), end pos: (65, 31)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_Eq, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -62,7 +62,7 @@ sums: dict[tuple[str, ...], float] def observe(self, value: float, *label_values: str) -&gt; None: - if len(label_values) != len(self.label_names): + if len(label_values) == len(self.label_names): raise ValueError("Label cardinality mismatch") labels = tuple(label_values) # Increment every bucket whose upper bound is &gt;= value so that</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: Label cardinality mismatch ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) WARNING server:server.py:160 after_request instrumentation failed: Label cardinality mismatch ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: Label cardinality mismatch WARNING server:server.py:272 Failed login attempt for email: user@email.se WARNING server:server.py:160 after_request instrumentation failed: Label cardinality mismatch _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: Label cardinality mismatch ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T014644077862Z__input.pdf user=1 WARNING server:server.py:160 after_request instrumentation failed: Label cardinality mismatch __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 WARNING server:server.py:160 after_request instrumentation failed: Label cardinality mismatch ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 WARNING server:server.py:160 after_request instrumentation failed: Label cardinality mismatch _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: Label cardinality mismatch WARNING server:server.py:972 Document not found or access denied for watermarking id=1 WARNING server:server.py:160 after_request instrumentation failed: Label cardinality mismatch __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: Label cardinality mismatch ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T014644986488Z__watermarked.pdf user=1 WARNING server:server.py:160 after_request instrumentation failed: Label cardinality mismatch _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: Label cardinality mismatch WARNING server:server.py:850 Document not found or access denied for deletion id=2 WARNING server:server.py:160 after_request instrumentation failed: Label cardinality mismatch ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.34s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1049"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1049_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1049_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1049_1"><button class="btn btn-outline-danger"><span class="job_id">1049 : Job ID 3884191b993544fc9e01fbf209062b05</span></button></div></a><div aria-labelledby="job_list___sub_heading_1049_1" data-parent="#job_list___sub_accordion_1049" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1049_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=37" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (37, 29), end pos: (37, 31)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_Lt, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -34,7 +34,7 @@ label_names: tuple[str, ...] def inc(self, *label_values: str, amount: float = 1.0) -&gt; None: - if len(label_values) != len(self.label_names): # defensive + if len(label_values) &lt; len(self.label_names): # defensive raise ValueError("Label cardinality mismatch") key = tuple(label_values) self.values[key] = self.values.get(key, 0.0) + amount</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.47s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1050"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1050_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1050_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1050_1"><button class="btn btn-outline-success"><span class="job_id">1050 : Job ID 77d88392b03e4f7f85d162bf8a835cc1</span></button></div></a><div aria-labelledby="job_list___sub_heading_1050_1" data-parent="#job_list___sub_accordion_1050" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1050_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=65" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (65, 29), end pos: (65, 31)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_Lt, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -62,7 +62,7 @@ sums: dict[tuple[str, ...], float] def observe(self, value: float, *label_values: str) -&gt; None: - if len(label_values) != len(self.label_names): + if len(label_values) &lt; len(self.label_names): raise ValueError("Label cardinality mismatch") labels = tuple(label_values) # Increment every bucket whose upper bound is &gt;= value so that</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T033316926856Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T033318235331Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 20.76s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1051"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1051_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1051_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1051_1"><button class="btn btn-outline-success"><span class="job_id">1051 : Job ID dc68d37afa3f4e1dae33aa79c89bc71e</span></button></div></a><div aria-labelledby="job_list___sub_heading_1051_1" data-parent="#job_list___sub_accordion_1051" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1051_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=37" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (37, 29), end pos: (37, 31)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_LtE, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -34,7 +34,7 @@ label_names: tuple[str, ...] def inc(self, *label_values: str, amount: float = 1.0) -&gt; None: - if len(label_values) != len(self.label_names): # defensive + if len(label_values) &lt;= len(self.label_names): # defensive raise ValueError("Label cardinality mismatch") key = tuple(label_values) self.values[key] = self.values.get(key, 0.0) + amount</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: Label cardinality mismatch ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) WARNING server:server.py:160 after_request instrumentation failed: Label cardinality mismatch ______________________________ test_login_route _______________________________ self = &lt;sqlalchemy.engine.base.Connection object at 0x0000021C80F85550&gt; engine = Engine(mysql+pymysql://tatou:***@127.0.0.1:3306/tatou?charset=utf8mb4) connection = None, _has_events = None, _allow_revalidate = True _allow_autobegin = True def __init__( self, engine: Engine, connection: Optional[PoolProxiedConnection] = None, _has_events: Optional[bool] = None, _allow_revalidate: bool = True, _allow_autobegin: bool = True, ): """Construct a new Connection.""" self.engine = engine self.dialect = dialect = engine.dialect if connection is None: try: &gt; self._dbapi_connection = engine.raw_connection() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:3301: in raw_connection return self.pool.connect() ^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:447: in connect return _ConnectionFairy._checkout(self) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:1264: in _checkout fairy = _ConnectionRecord.checkout(pool) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:711: in checkout rec = pool._do_get() ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\impl.py:177: in _do_get with util.safe_reraise(): C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\util\langhelpers.py:224: in __exit__ raise exc_value.with_traceback(exc_tb) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\impl.py:175: in _do_get return self._create_connection() ^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:388: in _create_connection return _ConnectionRecord(self) ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:673: in __init__ self.__connect() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:899: in __connect with util.safe_reraise(): C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\util\langhelpers.py:224: in __exit__ raise exc_value.with_traceback(exc_tb) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:895: in __connect self.dbapi_connection = connection = pool._invoke_creator(self) ^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\create.py:661: in connect return dialect.connect(*cargs, **cparams) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\default.py:629: in connect return self.loaded_dbapi.connect(*cargs, **cparams) # type: ignore[no-any-return] # NOQA: E501 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:365: in __init__ self.connect() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:680: in connect self._get_server_information() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:1099: in _get_server_information packet = self._read_packet() ^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:751: in _read_packet packet_header = self._read_bytes(4) ^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = &lt;pymysql.connections.Connection object at 0x0000021C80F85AF0&gt; num_bytes = 4 def _read_bytes(self, num_bytes): self._sock.settimeout(self._read_timeout) while True: try: data = self._rfile.read(num_bytes) break except OSError as e: if e.errno == errno.EINTR: continue self._force_close() raise err.OperationalError( CR.CR_SERVER_LOST, f"Lost connection to MySQL server during query ({e})", ) except BaseException: # Don't convert unknown exception to MySQLError. self._force_close() raise if len(data) &lt; num_bytes: self._force_close() &gt; raise err.OperationalError( CR.CR_SERVER_LOST, "Lost connection to MySQL server during query" ) E pymysql.err.OperationalError: (2013, 'Lost connection to MySQL server during query') C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:805: OperationalError The above exception was the direct cause of the following exception: @app.post("/api/login") def login(): payload = request.get_json(silent=True) or {} email = (payload.get("email") or "").strip() password = payload.get("password") or "" if not email or not password: app.logger.warning("Missing fields in login attempt: %s", payload) return jsonify({"error": "email and password are required"}), 400 start_db = time.time() try: &gt; with get_engine().connect() as conn: ^^^^^^^^^^^^^^^^^^^^^^ server.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:3277: in connect return self._connection_cls(self) ^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:145: in __init__ Connection._handle_dbapi_exception_noconnection( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:2440: in _handle_dbapi_exception_noconnection raise sqlalchemy_exception.with_traceback(exc_info[2]) from e C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:143: in __init__ self._dbapi_connection = engine.raw_connection() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:3301: in raw_connection return self.pool.connect() ^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:447: in connect return _ConnectionFairy._checkout(self) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:1264: in _checkout fairy = _ConnectionRecord.checkout(pool) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:711: in checkout rec = pool._do_get() ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\impl.py:177: in _do_get with util.safe_reraise(): C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\util\langhelpers.py:224: in __exit__ raise exc_value.with_traceback(exc_tb) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\impl.py:175: in _do_get return self._create_connection() ^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:388: in _create_connection return _ConnectionRecord(self) ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:673: in __init__ self.__connect() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:899: in __connect with util.safe_reraise(): C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\util\langhelpers.py:224: in __exit__ raise exc_value.with_traceback(exc_tb) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:895: in __connect self.dbapi_connection = connection = pool._invoke_creator(self) ^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\create.py:661: in connect return dialect.connect(*cargs, **cparams) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\default.py:629: in connect return self.loaded_dbapi.connect(*cargs, **cparams) # type: ignore[no-any-return] # NOQA: E501 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:365: in __init__ self.connect() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:680: in connect self._get_server_information() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:1099: in _get_server_information packet = self._read_packet() ^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:751: in _read_packet packet_header = self._read_bytes(4) ^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = &lt;pymysql.connections.Connection object at 0x0000021C80F85AF0&gt; num_bytes = 4 def _read_bytes(self, num_bytes): self._sock.settimeout(self._read_timeout) while True: try: data = self._rfile.read(num_bytes) break except OSError as e: if e.errno == errno.EINTR: continue self._force_close() raise err.OperationalError( CR.CR_SERVER_LOST, f"Lost connection to MySQL server during query ({e})", ) except BaseException: # Don't convert unknown exception to MySQLError. self._force_close() raise if len(data) &lt; num_bytes: self._force_close() &gt; raise err.OperationalError( CR.CR_SERVER_LOST, "Lost connection to MySQL server during query" ) E sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') E (Background on this error at: https://sqlalche.me/e/20/e3q8) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:805: OperationalError During handling of the above exception, another exception occurred: client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret &gt; resp = client.post("/api/login", json=parameters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:111: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:281: in login inc_db_error("login_select") observability.py:312: in inc_db_error DB_ERRORS.inc(op) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = CounterMetric(name='tatou_db_errors_total', help='Database operation errors', values={}, label_names=('operation',)) amount = 1.0, label_values = ('login_select',) def inc(self, *label_values: str, amount: float = 1.0) -&gt; None: if len(label_values) &lt;= len(self.label_names): # defensive &gt; raise ValueError("Label cardinality mismatch") E ValueError: Label cardinality mismatch observability.py:38: ValueError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: Label cardinality mismatch ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ self = &lt;sqlalchemy.engine.base.Connection object at 0x0000021C80E8BCE0&gt; engine = Engine(mysql+pymysql://tatou:***@127.0.0.1:3306/tatou?charset=utf8mb4) connection = None, _has_events = None, _allow_revalidate = True _allow_autobegin = True def __init__( self, engine: Engine, connection: Optional[PoolProxiedConnection] = None, _has_events: Optional[bool] = None, _allow_revalidate: bool = True, _allow_autobegin: bool = True, ): """Construct a new Connection.""" self.engine = engine self.dialect = dialect = engine.dialect if connection is None: try: &gt; self._dbapi_connection = engine.raw_connection() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:3301: in raw_connection return self.pool.connect() ^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:447: in connect return _ConnectionFairy._checkout(self) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:1264: in _checkout fairy = _ConnectionRecord.checkout(pool) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:711: in checkout rec = pool._do_get() ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\impl.py:177: in _do_get with util.safe_reraise(): C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\util\langhelpers.py:224: in __exit__ raise exc_value.with_traceback(exc_tb) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\impl.py:175: in _do_get return self._create_connection() ^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:388: in _create_connection return _ConnectionRecord(self) ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:673: in __init__ self.__connect() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:899: in __connect with util.safe_reraise(): C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\util\langhelpers.py:224: in __exit__ raise exc_value.with_traceback(exc_tb) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:895: in __connect self.dbapi_connection = connection = pool._invoke_creator(self) ^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\create.py:661: in connect return dialect.connect(*cargs, **cparams) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\default.py:629: in connect return self.loaded_dbapi.connect(*cargs, **cparams) # type: ignore[no-any-return] # NOQA: E501 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:365: in __init__ self.connect() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:680: in connect self._get_server_information() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:1099: in _get_server_information packet = self._read_packet() ^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:751: in _read_packet packet_header = self._read_bytes(4) ^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = &lt;pymysql.connections.Connection object at 0x0000021C81702900&gt; num_bytes = 4 def _read_bytes(self, num_bytes): self._sock.settimeout(self._read_timeout) while True: try: data = self._rfile.read(num_bytes) break except OSError as e: if e.errno == errno.EINTR: continue self._force_close() raise err.OperationalError( CR.CR_SERVER_LOST, f"Lost connection to MySQL server during query ({e})", ) except BaseException: # Don't convert unknown exception to MySQLError. self._force_close() raise if len(data) &lt; num_bytes: self._force_close() &gt; raise err.OperationalError( CR.CR_SERVER_LOST, "Lost connection to MySQL server during query" ) E pymysql.err.OperationalError: (2013, 'Lost connection to MySQL server during query') C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:805: OperationalError The above exception was the direct cause of the following exception: @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 user_dir = app.config["STORAGE_DIR"] / "files" / g.user["login"] user_dir.mkdir(parents=True, exist_ok=True) ts = dt.datetime.now(dt.UTC).strftime("%Y%m%dT%H%M%S%fZ") final_name = request.form.get("name") or fname stored_name = f"{ts}__{fname}" try: # Check for path traversal attempts stored_path = (user_dir / stored_name).resolve() if not str(stored_path).startswith(str(user_dir.resolve())): app.logger.warning("Upload attempt with invalid path: %s", stored_path) return jsonify({"error": "invalid path"}), 400 file.save(stored_path) except Exception as e: app.logger.error("File save error: %s", e) return jsonify({"error": "failed to save file"}), 500 sha_hex = _sha256_file(stored_path) size = stored_path.stat().st_size try: &gt; with get_engine().begin() as conn: server.py:364: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\contextlib.py:137: in __enter__ return next(self.gen) ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:3241: in begin with self.connect() as conn: ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:3277: in connect return self._connection_cls(self) ^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:145: in __init__ Connection._handle_dbapi_exception_noconnection( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:2440: in _handle_dbapi_exception_noconnection raise sqlalchemy_exception.with_traceback(exc_info[2]) from e C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:143: in __init__ self._dbapi_connection = engine.raw_connection() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:3301: in raw_connection return self.pool.connect() ^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:447: in connect return _ConnectionFairy._checkout(self) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:1264: in _checkout fairy = _ConnectionRecord.checkout(pool) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:711: in checkout rec = pool._do_get() ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\impl.py:177: in _do_get with util.safe_reraise(): C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\util\langhelpers.py:224: in __exit__ raise exc_value.with_traceback(exc_tb) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\impl.py:175: in _do_get return self._create_connection() ^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:388: in _create_connection return _ConnectionRecord(self) ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:673: in __init__ self.__connect() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:899: in __connect with util.safe_reraise(): C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\util\langhelpers.py:224: in __exit__ raise exc_value.with_traceback(exc_tb) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:895: in __connect self.dbapi_connection = connection = pool._invoke_creator(self) ^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\create.py:661: in connect return dialect.connect(*cargs, **cparams) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\default.py:629: in connect return self.loaded_dbapi.connect(*cargs, **cparams) # type: ignore[no-any-return] # NOQA: E501 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:365: in __init__ self.connect() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:680: in connect self._get_server_information() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:1099: in _get_server_information packet = self._read_packet() ^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:751: in _read_packet packet_header = self._read_bytes(4) ^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = &lt;pymysql.connections.Connection object at 0x0000021C81702900&gt; num_bytes = 4 def _read_bytes(self, num_bytes): self._sock.settimeout(self._read_timeout) while True: try: data = self._rfile.read(num_bytes) break except OSError as e: if e.errno == errno.EINTR: continue self._force_close() raise err.OperationalError( CR.CR_SERVER_LOST, f"Lost connection to MySQL server during query ({e})", ) except BaseException: # Don't convert unknown exception to MySQLError. self._force_close() raise if len(data) &lt; num_bytes: self._force_close() &gt; raise err.OperationalError( CR.CR_SERVER_LOST, "Lost connection to MySQL server during query" ) E sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') E (Background on this error at: https://sqlalche.me/e/20/e3q8) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:805: OperationalError During handling of the above exception, another exception occurred: client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } &gt; resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:147: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:398: in upload_document inc_db_error("insert_document") observability.py:312: in inc_db_error DB_ERRORS.inc(op) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = CounterMetric(name='tatou_db_errors_total', help='Database operation errors', values={}, label_names=('operation',)) amount = 1.0, label_values = ('insert_document',) def inc(self, *label_values: str, amount: float = 1.0) -&gt; None: if len(label_values) &lt;= len(self.label_names): # defensive &gt; raise ValueError("Label cardinality mismatch") E ValueError: Label cardinality mismatch observability.py:38: ValueError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: Label cardinality mismatch ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T061049427024Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ self = &lt;sqlalchemy.engine.base.Connection object at 0x0000021C80CCC860&gt; engine = Engine(mysql+pymysql://tatou:***@127.0.0.1:3306/tatou?charset=utf8mb4) connection = None, _has_events = None, _allow_revalidate = True _allow_autobegin = True def __init__( self, engine: Engine, connection: Optional[PoolProxiedConnection] = None, _has_events: Optional[bool] = None, _allow_revalidate: bool = True, _allow_autobegin: bool = True, ): """Construct a new Connection.""" self.engine = engine self.dialect = dialect = engine.dialect if connection is None: try: &gt; self._dbapi_connection = engine.raw_connection() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:3301: in raw_connection return self.pool.connect() ^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:447: in connect return _ConnectionFairy._checkout(self) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:1264: in _checkout fairy = _ConnectionRecord.checkout(pool) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:711: in checkout rec = pool._do_get() ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\impl.py:177: in _do_get with util.safe_reraise(): C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\util\langhelpers.py:224: in __exit__ raise exc_value.with_traceback(exc_tb) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\impl.py:175: in _do_get return self._create_connection() ^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:388: in _create_connection return _ConnectionRecord(self) ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:673: in __init__ self.__connect() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:899: in __connect with util.safe_reraise(): C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\util\langhelpers.py:224: in __exit__ raise exc_value.with_traceback(exc_tb) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:895: in __connect self.dbapi_connection = connection = pool._invoke_creator(self) ^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\create.py:661: in connect return dialect.connect(*cargs, **cparams) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\default.py:629: in connect return self.loaded_dbapi.connect(*cargs, **cparams) # type: ignore[no-any-return] # NOQA: E501 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:365: in __init__ self.connect() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:680: in connect self._get_server_information() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:1099: in _get_server_information packet = self._read_packet() ^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:751: in _read_packet packet_header = self._read_bytes(4) ^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = &lt;pymysql.connections.Connection object at 0x0000021C80CCCDA0&gt; num_bytes = 4 def _read_bytes(self, num_bytes): self._sock.settimeout(self._read_timeout) while True: try: data = self._rfile.read(num_bytes) break except OSError as e: if e.errno == errno.EINTR: continue self._force_close() raise err.OperationalError( CR.CR_SERVER_LOST, f"Lost connection to MySQL server during query ({e})", ) except BaseException: # Don't convert unknown exception to MySQLError. self._force_close() raise if len(data) &lt; num_bytes: self._force_close() &gt; raise err.OperationalError( CR.CR_SERVER_LOST, "Lost connection to MySQL server during query" ) E pymysql.err.OperationalError: (2013, 'Lost connection to MySQL server during query') C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:805: OperationalError The above exception was the direct cause of the following exception: @app.get("/api/list-documents") @require_auth def list_documents(): try: &gt; with get_engine().connect() as conn: ^^^^^^^^^^^^^^^^^^^^^^ server.py:419: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:3277: in connect return self._connection_cls(self) ^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:145: in __init__ Connection._handle_dbapi_exception_noconnection( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:2440: in _handle_dbapi_exception_noconnection raise sqlalchemy_exception.with_traceback(exc_info[2]) from e C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:143: in __init__ self._dbapi_connection = engine.raw_connection() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:3301: in raw_connection return self.pool.connect() ^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:447: in connect return _ConnectionFairy._checkout(self) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:1264: in _checkout fairy = _ConnectionRecord.checkout(pool) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:711: in checkout rec = pool._do_get() ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\impl.py:177: in _do_get with util.safe_reraise(): C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\util\langhelpers.py:224: in __exit__ raise exc_value.with_traceback(exc_tb) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\impl.py:175: in _do_get return self._create_connection() ^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:388: in _create_connection return _ConnectionRecord(self) ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:673: in __init__ self.__connect() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:899: in __connect with util.safe_reraise(): C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\util\langhelpers.py:224: in __exit__ raise exc_value.with_traceback(exc_tb) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:895: in __connect self.dbapi_connection = connection = pool._invoke_creator(self) ^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\create.py:661: in connect return dialect.connect(*cargs, **cparams) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\default.py:629: in connect return self.loaded_dbapi.connect(*cargs, **cparams) # type: ignore[no-any-return] # NOQA: E501 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:365: in __init__ self.connect() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:680: in connect self._get_server_information() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:1099: in _get_server_information packet = self._read_packet() ^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:751: in _read_packet packet_header = self._read_bytes(4) ^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = &lt;pymysql.connections.Connection object at 0x0000021C80CCCDA0&gt; num_bytes = 4 def _read_bytes(self, num_bytes): self._sock.settimeout(self._read_timeout) while True: try: data = self._rfile.read(num_bytes) break except OSError as e: if e.errno == errno.EINTR: continue self._force_close() raise err.OperationalError( CR.CR_SERVER_LOST, f"Lost connection to MySQL server during query ({e})", ) except BaseException: # Don't convert unknown exception to MySQLError. self._force_close() raise if len(data) &lt; num_bytes: self._force_close() &gt; raise err.OperationalError( CR.CR_SERVER_LOST, "Lost connection to MySQL server during query" ) E sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') E (Background on this error at: https://sqlalche.me/e/20/e3q8) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:805: OperationalError During handling of the above exception, another exception occurred: client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" &gt; resp = client.get("/api/list-documents") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:194: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1162: in get return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:435: in list_documents inc_db_error("list_documents") observability.py:312: in inc_db_error DB_ERRORS.inc(op) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = CounterMetric(name='tatou_db_errors_total', help='Database operation errors', values={}, label_names=('operation',)) amount = 1.0, label_values = ('list_documents',) def inc(self, *label_values: str, amount: float = 1.0) -&gt; None: if len(label_values) &lt;= len(self.label_names): # defensive &gt; raise ValueError("Label cardinality mismatch") E ValueError: Label cardinality mismatch observability.py:38: ValueError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: Label cardinality mismatch ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ self = &lt;sqlalchemy.engine.base.Connection object at 0x0000021C8101E480&gt; engine = Engine(mysql+pymysql://tatou:***@127.0.0.1:3306/tatou?charset=utf8mb4) connection = None, _has_events = None, _allow_revalidate = True _allow_autobegin = True def __init__( self, engine: Engine, connection: Optional[PoolProxiedConnection] = None, _has_events: Optional[bool] = None, _allow_revalidate: bool = True, _allow_autobegin: bool = True, ): """Construct a new Connection.""" self.engine = engine self.dialect = dialect = engine.dialect if connection is None: try: &gt; self._dbapi_connection = engine.raw_connection() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:3301: in raw_connection return self.pool.connect() ^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:447: in connect return _ConnectionFairy._checkout(self) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:1264: in _checkout fairy = _ConnectionRecord.checkout(pool) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:711: in checkout rec = pool._do_get() ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\impl.py:177: in _do_get with util.safe_reraise(): C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\util\langhelpers.py:224: in __exit__ raise exc_value.with_traceback(exc_tb) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\impl.py:175: in _do_get return self._create_connection() ^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:388: in _create_connection return _ConnectionRecord(self) ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:673: in __init__ self.__connect() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:899: in __connect with util.safe_reraise(): C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\util\langhelpers.py:224: in __exit__ raise exc_value.with_traceback(exc_tb) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:895: in __connect self.dbapi_connection = connection = pool._invoke_creator(self) ^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\create.py:661: in connect return dialect.connect(*cargs, **cparams) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\default.py:629: in connect return self.loaded_dbapi.connect(*cargs, **cparams) # type: ignore[no-any-return] # NOQA: E501 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:365: in __init__ self.connect() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:680: in connect self._get_server_information() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:1099: in _get_server_information packet = self._read_packet() ^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:751: in _read_packet packet_header = self._read_bytes(4) ^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = &lt;pymysql.connections.Connection object at 0x0000021C80FDCC50&gt; num_bytes = 4 def _read_bytes(self, num_bytes): self._sock.settimeout(self._read_timeout) while True: try: data = self._rfile.read(num_bytes) break except OSError as e: if e.errno == errno.EINTR: continue self._force_close() raise err.OperationalError( CR.CR_SERVER_LOST, f"Lost connection to MySQL server during query ({e})", ) except BaseException: # Don't convert unknown exception to MySQLError. self._force_close() raise if len(data) &lt; num_bytes: self._force_close() &gt; raise err.OperationalError( CR.CR_SERVER_LOST, "Lost connection to MySQL server during query" ) E pymysql.err.OperationalError: (2013, 'Lost connection to MySQL server during query') C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:805: OperationalError The above exception was the direct cause of the following exception: document_id = 1 @app.get("/api/list-versions") @app.get("/api/list-versions/&lt;int:document_id&gt;") @require_auth def list_versions(document_id: int | None = None): # Input validation if document_id is None: document_id = request.args.get("id") or request.args.get("documentid") try: document_id = int(document_id) if document_id else None if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 except (TypeError, ValueError): app.logger.warning("Invalid document id in query") return jsonify({"error": "document id required"}), 400 if document_id is None or document_id &lt;= 0 or document_id &gt; MAX_DB_INT: return jsonify({"error": "document id required"}), 400 try: &gt; with get_engine().connect() as conn: ^^^^^^^^^^^^^^^^^^^^^^ server.py:473: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:3277: in connect return self._connection_cls(self) ^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:145: in __init__ Connection._handle_dbapi_exception_noconnection( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:2440: in _handle_dbapi_exception_noconnection raise sqlalchemy_exception.with_traceback(exc_info[2]) from e C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:143: in __init__ self._dbapi_connection = engine.raw_connection() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:3301: in raw_connection return self.pool.connect() ^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:447: in connect return _ConnectionFairy._checkout(self) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:1264: in _checkout fairy = _ConnectionRecord.checkout(pool) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:711: in checkout rec = pool._do_get() ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\impl.py:177: in _do_get with util.safe_reraise(): C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\util\langhelpers.py:224: in __exit__ raise exc_value.with_traceback(exc_tb) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\impl.py:175: in _do_get return self._create_connection() ^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:388: in _create_connection return _ConnectionRecord(self) ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:673: in __init__ self.__connect() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:899: in __connect with util.safe_reraise(): C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\util\langhelpers.py:224: in __exit__ raise exc_value.with_traceback(exc_tb) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:895: in __connect self.dbapi_connection = connection = pool._invoke_creator(self) ^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\create.py:661: in connect return dialect.connect(*cargs, **cparams) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\default.py:629: in connect return self.loaded_dbapi.connect(*cargs, **cparams) # type: ignore[no-any-return] # NOQA: E501 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:365: in __init__ self.connect() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:680: in connect self._get_server_information() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:1099: in _get_server_information packet = self._read_packet() ^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:751: in _read_packet packet_header = self._read_bytes(4) ^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = &lt;pymysql.connections.Connection object at 0x0000021C80FDCC50&gt; num_bytes = 4 def _read_bytes(self, num_bytes): self._sock.settimeout(self._read_timeout) while True: try: data = self._rfile.read(num_bytes) break except OSError as e: if e.errno == errno.EINTR: continue self._force_close() raise err.OperationalError( CR.CR_SERVER_LOST, f"Lost connection to MySQL server during query ({e})", ) except BaseException: # Don't convert unknown exception to MySQLError. self._force_close() raise if len(data) &lt; num_bytes: self._force_close() &gt; raise err.OperationalError( CR.CR_SERVER_LOST, "Lost connection to MySQL server during query" ) E sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') E (Background on this error at: https://sqlalche.me/e/20/e3q8) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:805: OperationalError During handling of the above exception, another exception occurred: client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} &gt; resp = client.get("/api/list-versions", query_string = parameters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:215: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1162: in get return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:507: in list_versions inc_db_error("list_versions") observability.py:312: in inc_db_error DB_ERRORS.inc(op) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = CounterMetric(name='tatou_db_errors_total', help='Database operation errors', values={}, label_names=('operation',)) amount = 1.0, label_values = ('list_versions',) def inc(self, *label_values: str, amount: float = 1.0) -&gt; None: if len(label_values) &lt;= len(self.label_names): # defensive &gt; raise ValueError("Label cardinality mismatch") E ValueError: Label cardinality mismatch observability.py:38: ValueError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: Label cardinality mismatch ERROR server:server.py:504 Database error in list_versions: 1,1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: Label cardinality mismatch WARNING server:server.py:610 Document not found or access denied for id=1 WARNING server:server.py:160 after_request instrumentation failed: Label cardinality mismatch _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: Label cardinality mismatch WARNING server:server.py:972 Document not found or access denied for watermarking id=1 WARNING server:server.py:160 after_request instrumentation failed: Label cardinality mismatch __________________________ test_read_watermark_route __________________________ self = &lt;sqlalchemy.engine.base.Connection object at 0x0000021C82059DF0&gt; dialect = &lt;sqlalchemy.dialects.mysql.pymysql.MySQLDialect_pymysql object at 0x0000021C820E4F80&gt; context = &lt;sqlalchemy.dialects.mysql.mysqldb.MySQLExecutionContext_mysqldb object at 0x0000021C820E5520&gt; statement = &lt;sqlalchemy.dialects.mysql.mysqldb.MySQLCompiler_mysqldb object at 0x0000021C820E5550&gt; parameters = [{'name': 'Water File', 'ownerid': 1, 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storag...061053810416Z__watermarked.pdf', 'sha256hex': '5fbac867f5efdd7b0ab5c11456b204ddd08ff8801502c93728be3b38bfafe80c', ...}] def _exec_single_context( self, dialect: Dialect, context: ExecutionContext, statement: Union[str, Compiled], parameters: Optional[_AnyMultiExecuteParams], ) -&gt; CursorResult[Any]: """continue the _execute_context() method for a single DBAPI cursor.execute() or cursor.executemany() call. """ if dialect.bind_typing is BindTyping.SETINPUTSIZES: generic_setinputsizes = context._prepare_set_input_sizes() if generic_setinputsizes: try: dialect.do_set_input_sizes( context.cursor, generic_setinputsizes, context ) except BaseException as e: self._handle_dbapi_exception( e, str(statement), parameters, None, context ) cursor, str_statement, parameters = ( context.cursor, context.statement, context.parameters, ) effective_parameters: Optional[_AnyExecuteParams] if not context.executemany: effective_parameters = parameters[0] else: effective_parameters = parameters if self._has_events or self.engine._has_events: for fn in self.dispatch.before_cursor_execute: str_statement, effective_parameters = fn( self, cursor, str_statement, effective_parameters, context, context.executemany, ) if self._echo: self._log_info(str_statement) stats = context._get_cache_stats() if not self.engine.hide_parameters: self._log_info( "[%s] %r", stats, sql_util._repr_params( effective_parameters, batches=10, ismulti=context.executemany, ), ) else: self._log_info( "[%s] [SQL parameters hidden due to hide_parameters=True]", stats, ) evt_handled: bool = False try: if context.execute_style is ExecuteStyle.EXECUTEMANY: effective_parameters = cast( "_CoreMultiExecuteParams", effective_parameters ) if self.dialect._has_events: for fn in self.dialect.dispatch.do_executemany: if fn( cursor, str_statement, effective_parameters, context, ): evt_handled = True break if not evt_handled: self.dialect.do_executemany( cursor, str_statement, effective_parameters, context, ) elif not effective_parameters and context.no_parameters: if self.dialect._has_events: for fn in self.dialect.dispatch.do_execute_no_params: if fn(cursor, str_statement, context): evt_handled = True break if not evt_handled: self.dialect.do_execute_no_params( cursor, str_statement, context ) else: effective_parameters = cast( "_CoreSingleExecuteParams", effective_parameters ) if self.dialect._has_events: for fn in self.dialect.dispatch.do_execute: if fn( cursor, str_statement, effective_parameters, context, ): evt_handled = True break if not evt_handled: &gt; self.dialect.do_execute( cursor, str_statement, effective_parameters, context ) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:1967: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\default.py:951: in do_execute cursor.execute(statement, parameters) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\cursors.py:153: in execute result = self._query(query) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\cursors.py:322: in _query conn.query(q) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:575: in query self._affected_rows = self._read_query_result(unbuffered=unbuffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:826: in _read_query_result result.read() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:1203: in read first_packet = self.connection._read_packet() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:782: in _read_packet packet.raise_for_error() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\protocol.py:219: in raise_for_error err.raise_mysql_exception(self._data) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ data = b'\xff\xac\x05#23000Cannot add or update a child row: a foreign key constraint fails (`tatou`.`Documents`, CONSTRAINT `fk_documents_owner` FOREIGN KEY (`ownerid`) REFERENCES `Users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)' def raise_mysql_exception(data): errno = struct.unpack("&lt;h", data[1:3])[0] # https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_basic_err_packet.html # Error packet has optional sqlstate that is 5 bytes and starts with '#'. if data[3] == 0x23: # '#' # sqlstate = data[4:9].decode() # TODO: Append (sqlstate) in the error message. This will be come in next minor release. errval = data[9:].decode("utf-8", "replace") else: errval = data[3:].decode("utf-8", "replace") errorclass = error_map.get(errno) if errorclass is None: errorclass = InternalError if errno &lt; 1000 else OperationalError &gt; raise errorclass(errno, errval) E pymysql.err.IntegrityError: (1452, 'Cannot add or update a child row: a foreign key constraint fails (`tatou`.`Documents`, CONSTRAINT `fk_documents_owner` FOREIGN KEY (`ownerid`) REFERENCES `Users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)') C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\err.py:150: IntegrityError The above exception was the direct cause of the following exception: @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 user_dir = app.config["STORAGE_DIR"] / "files" / g.user["login"] user_dir.mkdir(parents=True, exist_ok=True) ts = dt.datetime.now(dt.UTC).strftime("%Y%m%dT%H%M%S%fZ") final_name = request.form.get("name") or fname stored_name = f"{ts}__{fname}" try: # Check for path traversal attempts stored_path = (user_dir / stored_name).resolve() if not str(stored_path).startswith(str(user_dir.resolve())): app.logger.warning("Upload attempt with invalid path: %s", stored_path) return jsonify({"error": "invalid path"}), 400 file.save(stored_path) except Exception as e: app.logger.error("File save error: %s", e) return jsonify({"error": "failed to save file"}), 500 sha_hex = _sha256_file(stored_path) size = stored_path.stat().st_size try: with get_engine().begin() as conn: &gt; conn.execute( text( """ INSERT INTO Documents (name, path, ownerid, sha256, size) VALUES (:name, :path, :ownerid, UNHEX(:sha256hex), :size) """ ), { "name": final_name, "path": str(stored_path), "ownerid": int(g.user["id"]), "sha256hex": sha_hex, "size": int(size), }, ) server.py:365: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:1419: in execute return meth( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\sql\elements.py:526: in _execute_on_connection return connection._execute_clauseelement( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:1641: in _execute_clauseelement ret = self._execute_context( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:1846: in _execute_context return self._exec_single_context( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:1986: in _exec_single_context self._handle_dbapi_exception( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:2355: in _handle_dbapi_exception raise sqlalchemy_exception.with_traceback(exc_info[2]) from e C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:1967: in _exec_single_context self.dialect.do_execute( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\default.py:951: in do_execute cursor.execute(statement, parameters) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\cursors.py:153: in execute result = self._query(query) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\cursors.py:322: in _query conn.query(q) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:575: in query self._affected_rows = self._read_query_result(unbuffered=unbuffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:826: in _read_query_result result.read() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:1203: in read first_packet = self.connection._read_packet() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:782: in _read_packet packet.raise_for_error() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\protocol.py:219: in raise_for_error err.raise_mysql_exception(self._data) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ data = b'\xff\xac\x05#23000Cannot add or update a child row: a foreign key constraint fails (`tatou`.`Documents`, CONSTRAINT `fk_documents_owner` FOREIGN KEY (`ownerid`) REFERENCES `Users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)' def raise_mysql_exception(data): errno = struct.unpack("&lt;h", data[1:3])[0] # https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_basic_err_packet.html # Error packet has optional sqlstate that is 5 bytes and starts with '#'. if data[3] == 0x23: # '#' # sqlstate = data[4:9].decode() # TODO: Append (sqlstate) in the error message. This will be come in next minor release. errval = data[9:].decode("utf-8", "replace") else: errval = data[3:].decode("utf-8", "replace") errorclass = error_map.get(errno) if errorclass is None: errorclass = InternalError if errno &lt; 1000 else OperationalError &gt; raise errorclass(errno, errval) E sqlalchemy.exc.IntegrityError: (pymysql.err.IntegrityError) (1452, 'Cannot add or update a child row: a foreign key constraint fails (`tatou`.`Documents`, CONSTRAINT `fk_documents_owner` FOREIGN KEY (`ownerid`) REFERENCES `Users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)') E [SQL: E INSERT INTO Documents (name, path, ownerid, sha256, size) E VALUES (%(name)s, %(path)s, %(ownerid)s, UNHEX(%(sha256hex)s), %(size)s) E ] E [parameters: {'name': 'Water File', 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username\\20251017T061053810416Z__watermarked.pdf', 'ownerid': 1, 'sha256hex': '5fbac867f5efdd7b0ab5c11456b204ddd08ff8801502c93728be3b38bfafe80c', 'size': 39265}] E (Background on this error at: https://sqlalche.me/e/20/gkpj) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\err.py:150: IntegrityError During handling of the above exception, another exception occurred: client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } &gt; upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:387: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:398: in upload_document inc_db_error("insert_document") observability.py:312: in inc_db_error DB_ERRORS.inc(op) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = CounterMetric(name='tatou_db_errors_total', help='Database operation errors', values={}, label_names=('operation',)) amount = 1.0, label_values = ('insert_document',) def inc(self, *label_values: str, amount: float = 1.0) -&gt; None: if len(label_values) &lt;= len(self.label_names): # defensive &gt; raise ValueError("Label cardinality mismatch") E ValueError: Label cardinality mismatch observability.py:38: ValueError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: Label cardinality mismatch ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T061053810416Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: Label cardinality mismatch WARNING server:server.py:850 Document not found or access denied for deletion id=2 WARNING server:server.py:160 after_request instrumentation failed: Label cardinality mismatch ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - ValueError: Label cardinality ... FAILED ..\test\test_api.py::test_upload_document_route - ValueError: Label ca... FAILED ..\test\test_api.py::test_list_documents_route - ValueError: Label car... FAILED ..\test\test_api.py::test_list_versions_route - ValueError: Label card... FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - ValueError: Label car... FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 26.78s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1052"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1052_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1052_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1052_1"><button class="btn btn-outline-success"><span class="job_id">1052 : Job ID ed3d4e4063744efeb7038a4c79c89037</span></button></div></a><div aria-labelledby="job_list___sub_heading_1052_1" data-parent="#job_list___sub_accordion_1052" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1052_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=65" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (65, 29), end pos: (65, 31)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_LtE, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -62,7 +62,7 @@ sums: dict[tuple[str, ...], float] def observe(self, value: float, *label_values: str) -&gt; None: - if len(label_values) != len(self.label_names): + if len(label_values) &lt;= len(self.label_names): raise ValueError("Label cardinality mismatch") labels = tuple(label_values) # Increment every bucket whose upper bound is &gt;= value so that</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.....FF... [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: Label cardinality mismatch ERROR server:server.py:236 Database error in create_user: Label cardinality mismatch WARNING server:server.py:160 after_request instrumentation failed: Label cardinality mismatch ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret &gt; resp = client.post("/api/login", json=parameters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:111: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:284: in login observe_db_latency("login_select", time.time() - start_db) observability.py:317: in observe_db_latency DB_QUERY_LATENCY.observe(duration, op) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = HistogramMetric(name='tatou_db_query_duration_seconds', help='Duration of DB operations (best-effort manual instrument...n)', label_names=('operation',), buckets=(0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5), counts={}, sums={}) value = 0.11259961128234863, label_values = ('login_select',) def observe(self, value: float, *label_values: str) -&gt; None: if len(label_values) &lt;= len(self.label_names): &gt; raise ValueError("Label cardinality mismatch") E ValueError: Label cardinality mismatch observability.py:66: ValueError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: Label cardinality mismatch _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } &gt; resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:147: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:401: in upload_document observe_db_latency("insert_document", time.time() - start_db) observability.py:317: in observe_db_latency DB_QUERY_LATENCY.observe(duration, op) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = HistogramMetric(name='tatou_db_query_duration_seconds', help='Duration of DB operations (best-effort manual instrument...n)', label_names=('operation',), buckets=(0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5), counts={}, sums={}) value = 0.0381472110748291, label_values = ('insert_document',) def observe(self, value: float, *label_values: str) -&gt; None: if len(label_values) &lt;= len(self.label_names): &gt; raise ValueError("Label cardinality mismatch") E ValueError: Label cardinality mismatch observability.py:66: ValueError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: Label cardinality mismatch _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: Label cardinality mismatch ERROR server:server.py:1034 Watermarking failed for document 1 using method robust-xmp: Label cardinality mismatch WARNING server:server.py:160 after_request instrumentation failed: Label cardinality mismatch __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } &gt; upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:387: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:401: in upload_document observe_db_latency("insert_document", time.time() - start_db) observability.py:317: in observe_db_latency DB_QUERY_LATENCY.observe(duration, op) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = HistogramMetric(name='tatou_db_query_duration_seconds', help='Duration of DB operations (best-effort manual instrument...n)', label_names=('operation',), buckets=(0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5), counts={}, sums={}) value = 0.03791356086730957, label_values = ('insert_document',) def observe(self, value: float, *label_values: str) -&gt; None: if len(label_values) &lt;= len(self.label_names): &gt; raise ValueError("Label cardinality mismatch") E ValueError: Label cardinality mismatch observability.py:66: ValueError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: Label cardinality mismatch ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - ValueError: Label cardinality ... FAILED ..\test\test_api.py::test_upload_document_route - ValueError: Label ca... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - ValueError: Label car... 5 failed, 9 passed, 22 warnings in 20.40s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1053"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1053_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1053_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1053_1"><button class="btn btn-outline-danger"><span class="job_id">1053 : Job ID 6fca913eabc6422ea1ba8c26e4074bb6</span></button></div></a><div aria-labelledby="job_list___sub_heading_1053_1" data-parent="#job_list___sub_accordion_1053" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1053_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=37" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (37, 29), end pos: (37, 31)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_Gt, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -34,7 +34,7 @@ label_names: tuple[str, ...] def inc(self, *label_values: str, amount: float = 1.0) -&gt; None: - if len(label_values) != len(self.label_names): # defensive + if len(label_values) &gt; len(self.label_names): # defensive raise ValueError("Label cardinality mismatch") key = tuple(label_values) self.values[key] = self.values.get(key, 0.0) + amount</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.93s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1054"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1054_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1054_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1054_1"><button class="btn btn-outline-danger"><span class="job_id">1054 : Job ID 6a38a16b1bdb484dafc215ec974fc7b5</span></button></div></a><div aria-labelledby="job_list___sub_heading_1054_1" data-parent="#job_list___sub_accordion_1054" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1054_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=65" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (65, 29), end pos: (65, 31)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_Gt, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -62,7 +62,7 @@ sums: dict[tuple[str, ...], float] def observe(self, value: float, *label_values: str) -&gt; None: - if len(label_values) != len(self.label_names): + if len(label_values) &gt; len(self.label_names): raise ValueError("Label cardinality mismatch") labels = tuple(label_values) # Increment every bucket whose upper bound is &gt;= value so that</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.01s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1055"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1055_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1055_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1055_1"><button class="btn btn-outline-success"><span class="job_id">1055 : Job ID da253ad028e942de9c97d07277a6e2c4</span></button></div></a><div aria-labelledby="job_list___sub_heading_1055_1" data-parent="#job_list___sub_accordion_1055" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1055_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=37" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (37, 29), end pos: (37, 31)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_GtE, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -34,7 +34,7 @@ label_names: tuple[str, ...] def inc(self, *label_values: str, amount: float = 1.0) -&gt; None: - if len(label_values) != len(self.label_names): # defensive + if len(label_values) &gt;= len(self.label_names): # defensive raise ValueError("Label cardinality mismatch") key = tuple(label_values) self.values[key] = self.values.get(key, 0.0) + amount</pre></div><div class="alert alert-secondary"><pre class="diff">..FF.....FF... [100%] ================================== FAILURES =================================== ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret &gt; resp = client.post("/api/login", json=parameters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:111: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:288: in login inc_login_success() observability.py:276: in inc_login_success LOGIN_SUCCESSES.inc() _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = CounterMetric(name='tatou_login_successes_total', help='Successful logins', values={}, label_names=()) amount = 1.0, label_values = () def inc(self, *label_values: str, amount: float = 1.0) -&gt; None: if len(label_values) &gt;= len(self.label_names): # defensive &gt; raise ValueError("Label cardinality mismatch") E ValueError: Label cardinality mismatch observability.py:38: ValueError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: Label cardinality mismatch _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } &gt; resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:147: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:411: in upload_document inc_upload(int(row.size)) observability.py:301: in inc_upload UPLOADS.inc() _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = CounterMetric(name='tatou_uploads_total', help='Number of PDF uploads', values={}, label_names=()) amount = 1.0, label_values = () def inc(self, *label_values: str, amount: float = 1.0) -&gt; None: if len(label_values) &gt;= len(self.label_names): # defensive &gt; raise ValueError("Label cardinality mismatch") E ValueError: Label cardinality mismatch observability.py:38: ValueError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: Label cardinality mismatch _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} &gt; resp = client.post("/api/create-watermark", json=parameters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:317: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:1115: in create_watermark inc_watermark_created(method) observability.py:281: in inc_watermark_created WATERMARK_CREATED.inc(method) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = CounterMetric(name='tatou_watermarks_created_total', help='Watermarks created', values={}, label_names=('method',)) amount = 1.0, label_values = ('robust-xmp',) def inc(self, *label_values: str, amount: float = 1.0) -&gt; None: if len(label_values) &gt;= len(self.label_names): # defensive &gt; raise ValueError("Label cardinality mismatch") E ValueError: Label cardinality mismatch observability.py:38: ValueError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: Label cardinality mismatch __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } &gt; upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:387: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:411: in upload_document inc_upload(int(row.size)) observability.py:301: in inc_upload UPLOADS.inc() _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = CounterMetric(name='tatou_uploads_total', help='Number of PDF uploads', values={}, label_names=()) amount = 1.0, label_values = () def inc(self, *label_values: str, amount: float = 1.0) -&gt; None: if len(label_values) &gt;= len(self.label_names): # defensive &gt; raise ValueError("Label cardinality mismatch") E ValueError: Label cardinality mismatch observability.py:38: ValueError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: Label cardinality mismatch ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_login_route - ValueError: Label cardinality ... FAILED ..\test\test_api.py::test_upload_document_route - ValueError: Label ca... FAILED ..\test\test_api.py::test_create_watermark_route - ValueError: Label c... FAILED ..\test\test_api.py::test_read_watermark_route - ValueError: Label car... 4 failed, 10 passed, 22 warnings in 19.95s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1056"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1056_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1056_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1056_1"><button class="btn btn-outline-success"><span class="job_id">1056 : Job ID ae2898c211d54f239994fe8187235bda</span></button></div></a><div aria-labelledby="job_list___sub_heading_1056_1" data-parent="#job_list___sub_accordion_1056" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1056_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=65" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (65, 29), end pos: (65, 31)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_GtE, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -62,7 +62,7 @@ sums: dict[tuple[str, ...], float] def observe(self, value: float, *label_values: str) -&gt; None: - if len(label_values) != len(self.label_names): + if len(label_values) &gt;= len(self.label_names): raise ValueError("Label cardinality mismatch") labels = tuple(label_values) # Increment every bucket whose upper bound is &gt;= value so that</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.....FF... [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: Label cardinality mismatch ERROR server:server.py:236 Database error in create_user: Label cardinality mismatch WARNING server:server.py:160 after_request instrumentation failed: Label cardinality mismatch ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret &gt; resp = client.post("/api/login", json=parameters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:111: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:284: in login observe_db_latency("login_select", time.time() - start_db) observability.py:317: in observe_db_latency DB_QUERY_LATENCY.observe(duration, op) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = HistogramMetric(name='tatou_db_query_duration_seconds', help='Duration of DB operations (best-effort manual instrument...n)', label_names=('operation',), buckets=(0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5), counts={}, sums={}) value = 0.13947391510009766, label_values = ('login_select',) def observe(self, value: float, *label_values: str) -&gt; None: if len(label_values) &gt;= len(self.label_names): &gt; raise ValueError("Label cardinality mismatch") E ValueError: Label cardinality mismatch observability.py:66: ValueError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: Label cardinality mismatch _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } &gt; resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:147: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:401: in upload_document observe_db_latency("insert_document", time.time() - start_db) observability.py:317: in observe_db_latency DB_QUERY_LATENCY.observe(duration, op) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = HistogramMetric(name='tatou_db_query_duration_seconds', help='Duration of DB operations (best-effort manual instrument...n)', label_names=('operation',), buckets=(0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5), counts={}, sums={}) value = 0.05463719367980957, label_values = ('insert_document',) def observe(self, value: float, *label_values: str) -&gt; None: if len(label_values) &gt;= len(self.label_names): &gt; raise ValueError("Label cardinality mismatch") E ValueError: Label cardinality mismatch observability.py:66: ValueError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: Label cardinality mismatch _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: Label cardinality mismatch ERROR server:server.py:1034 Watermarking failed for document 1 using method robust-xmp: Label cardinality mismatch WARNING server:server.py:160 after_request instrumentation failed: Label cardinality mismatch __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } &gt; upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:387: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:401: in upload_document observe_db_latency("insert_document", time.time() - start_db) observability.py:317: in observe_db_latency DB_QUERY_LATENCY.observe(duration, op) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = HistogramMetric(name='tatou_db_query_duration_seconds', help='Duration of DB operations (best-effort manual instrument...n)', label_names=('operation',), buckets=(0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5), counts={}, sums={}) value = 0.04544377326965332, label_values = ('insert_document',) def observe(self, value: float, *label_values: str) -&gt; None: if len(label_values) &gt;= len(self.label_names): &gt; raise ValueError("Label cardinality mismatch") E ValueError: Label cardinality mismatch observability.py:66: ValueError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: Label cardinality mismatch ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - ValueError: Label cardinality ... FAILED ..\test\test_api.py::test_upload_document_route - ValueError: Label ca... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - ValueError: Label car... 5 failed, 9 passed, 22 warnings in 19.67s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1057"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1057_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1057_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1057_1"><button class="btn btn-outline-success"><span class="job_id">1057 : Job ID c3f06f53d66e4d869adf4718aa4e522b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1057_1" data-parent="#job_list___sub_accordion_1057" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1057_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=37" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (37, 29), end pos: (37, 31)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_Is, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -34,7 +34,7 @@ label_names: tuple[str, ...] def inc(self, *label_values: str, amount: float = 1.0) -&gt; None: - if len(label_values) != len(self.label_names): # defensive + if len(label_values) is len(self.label_names): # defensive raise ValueError("Label cardinality mismatch") key = tuple(label_values) self.values[key] = self.values.get(key, 0.0) + amount</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: Label cardinality mismatch ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) WARNING server:server.py:160 after_request instrumentation failed: Label cardinality mismatch ______________________________ test_login_route _______________________________ self = &lt;sqlalchemy.engine.base.Connection object at 0x000001DC00B71010&gt; engine = Engine(mysql+pymysql://tatou:***@127.0.0.1:3306/tatou?charset=utf8mb4) connection = None, _has_events = None, _allow_revalidate = True _allow_autobegin = True def __init__( self, engine: Engine, connection: Optional[PoolProxiedConnection] = None, _has_events: Optional[bool] = None, _allow_revalidate: bool = True, _allow_autobegin: bool = True, ): """Construct a new Connection.""" self.engine = engine self.dialect = dialect = engine.dialect if connection is None: try: &gt; self._dbapi_connection = engine.raw_connection() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:3301: in raw_connection return self.pool.connect() ^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:447: in connect return _ConnectionFairy._checkout(self) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:1264: in _checkout fairy = _ConnectionRecord.checkout(pool) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:711: in checkout rec = pool._do_get() ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\impl.py:177: in _do_get with util.safe_reraise(): C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\util\langhelpers.py:224: in __exit__ raise exc_value.with_traceback(exc_tb) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\impl.py:175: in _do_get return self._create_connection() ^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:388: in _create_connection return _ConnectionRecord(self) ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:673: in __init__ self.__connect() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:899: in __connect with util.safe_reraise(): C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\util\langhelpers.py:224: in __exit__ raise exc_value.with_traceback(exc_tb) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:895: in __connect self.dbapi_connection = connection = pool._invoke_creator(self) ^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\create.py:661: in connect return dialect.connect(*cargs, **cparams) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\default.py:629: in connect return self.loaded_dbapi.connect(*cargs, **cparams) # type: ignore[no-any-return] # NOQA: E501 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:365: in __init__ self.connect() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:680: in connect self._get_server_information() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:1099: in _get_server_information packet = self._read_packet() ^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:751: in _read_packet packet_header = self._read_bytes(4) ^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = &lt;pymysql.connections.Connection object at 0x000001DC00B715E0&gt; num_bytes = 4 def _read_bytes(self, num_bytes): self._sock.settimeout(self._read_timeout) while True: try: data = self._rfile.read(num_bytes) break except OSError as e: if e.errno == errno.EINTR: continue self._force_close() raise err.OperationalError( CR.CR_SERVER_LOST, f"Lost connection to MySQL server during query ({e})", ) except BaseException: # Don't convert unknown exception to MySQLError. self._force_close() raise if len(data) &lt; num_bytes: self._force_close() &gt; raise err.OperationalError( CR.CR_SERVER_LOST, "Lost connection to MySQL server during query" ) E pymysql.err.OperationalError: (2013, 'Lost connection to MySQL server during query') C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:805: OperationalError The above exception was the direct cause of the following exception: @app.post("/api/login") def login(): payload = request.get_json(silent=True) or {} email = (payload.get("email") or "").strip() password = payload.get("password") or "" if not email or not password: app.logger.warning("Missing fields in login attempt: %s", payload) return jsonify({"error": "email and password are required"}), 400 start_db = time.time() try: &gt; with get_engine().connect() as conn: ^^^^^^^^^^^^^^^^^^^^^^ server.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:3277: in connect return self._connection_cls(self) ^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:145: in __init__ Connection._handle_dbapi_exception_noconnection( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:2440: in _handle_dbapi_exception_noconnection raise sqlalchemy_exception.with_traceback(exc_info[2]) from e C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:143: in __init__ self._dbapi_connection = engine.raw_connection() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:3301: in raw_connection return self.pool.connect() ^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:447: in connect return _ConnectionFairy._checkout(self) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:1264: in _checkout fairy = _ConnectionRecord.checkout(pool) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:711: in checkout rec = pool._do_get() ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\impl.py:177: in _do_get with util.safe_reraise(): C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\util\langhelpers.py:224: in __exit__ raise exc_value.with_traceback(exc_tb) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\impl.py:175: in _do_get return self._create_connection() ^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:388: in _create_connection return _ConnectionRecord(self) ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:673: in __init__ self.__connect() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:899: in __connect with util.safe_reraise(): C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\util\langhelpers.py:224: in __exit__ raise exc_value.with_traceback(exc_tb) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:895: in __connect self.dbapi_connection = connection = pool._invoke_creator(self) ^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\create.py:661: in connect return dialect.connect(*cargs, **cparams) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\default.py:629: in connect return self.loaded_dbapi.connect(*cargs, **cparams) # type: ignore[no-any-return] # NOQA: E501 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:365: in __init__ self.connect() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:680: in connect self._get_server_information() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:1099: in _get_server_information packet = self._read_packet() ^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:751: in _read_packet packet_header = self._read_bytes(4) ^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = &lt;pymysql.connections.Connection object at 0x000001DC00B715E0&gt; num_bytes = 4 def _read_bytes(self, num_bytes): self._sock.settimeout(self._read_timeout) while True: try: data = self._rfile.read(num_bytes) break except OSError as e: if e.errno == errno.EINTR: continue self._force_close() raise err.OperationalError( CR.CR_SERVER_LOST, f"Lost connection to MySQL server during query ({e})", ) except BaseException: # Don't convert unknown exception to MySQLError. self._force_close() raise if len(data) &lt; num_bytes: self._force_close() &gt; raise err.OperationalError( CR.CR_SERVER_LOST, "Lost connection to MySQL server during query" ) E sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') E (Background on this error at: https://sqlalche.me/e/20/e3q8) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:805: OperationalError During handling of the above exception, another exception occurred: client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret &gt; resp = client.post("/api/login", json=parameters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:111: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:281: in login inc_db_error("login_select") observability.py:312: in inc_db_error DB_ERRORS.inc(op) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = CounterMetric(name='tatou_db_errors_total', help='Database operation errors', values={}, label_names=('operation',)) amount = 1.0, label_values = ('login_select',) def inc(self, *label_values: str, amount: float = 1.0) -&gt; None: if len(label_values) is len(self.label_names): # defensive &gt; raise ValueError("Label cardinality mismatch") E ValueError: Label cardinality mismatch observability.py:38: ValueError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: Label cardinality mismatch ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ self = &lt;sqlalchemy.engine.base.Connection object at 0x000001DC00A6EA50&gt; engine = Engine(mysql+pymysql://tatou:***@127.0.0.1:3306/tatou?charset=utf8mb4) connection = None, _has_events = None, _allow_revalidate = True _allow_autobegin = True def __init__( self, engine: Engine, connection: Optional[PoolProxiedConnection] = None, _has_events: Optional[bool] = None, _allow_revalidate: bool = True, _allow_autobegin: bool = True, ): """Construct a new Connection.""" self.engine = engine self.dialect = dialect = engine.dialect if connection is None: try: &gt; self._dbapi_connection = engine.raw_connection() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:3301: in raw_connection return self.pool.connect() ^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:447: in connect return _ConnectionFairy._checkout(self) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:1264: in _checkout fairy = _ConnectionRecord.checkout(pool) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:711: in checkout rec = pool._do_get() ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\impl.py:177: in _do_get with util.safe_reraise(): C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\util\langhelpers.py:224: in __exit__ raise exc_value.with_traceback(exc_tb) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\impl.py:175: in _do_get return self._create_connection() ^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:388: in _create_connection return _ConnectionRecord(self) ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:673: in __init__ self.__connect() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:899: in __connect with util.safe_reraise(): C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\util\langhelpers.py:224: in __exit__ raise exc_value.with_traceback(exc_tb) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:895: in __connect self.dbapi_connection = connection = pool._invoke_creator(self) ^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\create.py:661: in connect return dialect.connect(*cargs, **cparams) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\default.py:629: in connect return self.loaded_dbapi.connect(*cargs, **cparams) # type: ignore[no-any-return] # NOQA: E501 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:365: in __init__ self.connect() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:680: in connect self._get_server_information() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:1099: in _get_server_information packet = self._read_packet() ^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:751: in _read_packet packet_header = self._read_bytes(4) ^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = &lt;pymysql.connections.Connection object at 0x000001DC00A6ED20&gt; num_bytes = 4 def _read_bytes(self, num_bytes): self._sock.settimeout(self._read_timeout) while True: try: data = self._rfile.read(num_bytes) break except OSError as e: if e.errno == errno.EINTR: continue self._force_close() raise err.OperationalError( CR.CR_SERVER_LOST, f"Lost connection to MySQL server during query ({e})", ) except BaseException: # Don't convert unknown exception to MySQLError. self._force_close() raise if len(data) &lt; num_bytes: self._force_close() &gt; raise err.OperationalError( CR.CR_SERVER_LOST, "Lost connection to MySQL server during query" ) E pymysql.err.OperationalError: (2013, 'Lost connection to MySQL server during query') C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:805: OperationalError The above exception was the direct cause of the following exception: @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 user_dir = app.config["STORAGE_DIR"] / "files" / g.user["login"] user_dir.mkdir(parents=True, exist_ok=True) ts = dt.datetime.now(dt.UTC).strftime("%Y%m%dT%H%M%S%fZ") final_name = request.form.get("name") or fname stored_name = f"{ts}__{fname}" try: # Check for path traversal attempts stored_path = (user_dir / stored_name).resolve() if not str(stored_path).startswith(str(user_dir.resolve())): app.logger.warning("Upload attempt with invalid path: %s", stored_path) return jsonify({"error": "invalid path"}), 400 file.save(stored_path) except Exception as e: app.logger.error("File save error: %s", e) return jsonify({"error": "failed to save file"}), 500 sha_hex = _sha256_file(stored_path) size = stored_path.stat().st_size try: &gt; with get_engine().begin() as conn: server.py:364: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\contextlib.py:137: in __enter__ return next(self.gen) ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:3241: in begin with self.connect() as conn: ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:3277: in connect return self._connection_cls(self) ^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:145: in __init__ Connection._handle_dbapi_exception_noconnection( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:2440: in _handle_dbapi_exception_noconnection raise sqlalchemy_exception.with_traceback(exc_info[2]) from e C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:143: in __init__ self._dbapi_connection = engine.raw_connection() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:3301: in raw_connection return self.pool.connect() ^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:447: in connect return _ConnectionFairy._checkout(self) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:1264: in _checkout fairy = _ConnectionRecord.checkout(pool) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:711: in checkout rec = pool._do_get() ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\impl.py:177: in _do_get with util.safe_reraise(): C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\util\langhelpers.py:224: in __exit__ raise exc_value.with_traceback(exc_tb) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\impl.py:175: in _do_get return self._create_connection() ^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:388: in _create_connection return _ConnectionRecord(self) ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:673: in __init__ self.__connect() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:899: in __connect with util.safe_reraise(): C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\util\langhelpers.py:224: in __exit__ raise exc_value.with_traceback(exc_tb) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\pool\base.py:895: in __connect self.dbapi_connection = connection = pool._invoke_creator(self) ^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\create.py:661: in connect return dialect.connect(*cargs, **cparams) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\default.py:629: in connect return self.loaded_dbapi.connect(*cargs, **cparams) # type: ignore[no-any-return] # NOQA: E501 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:365: in __init__ self.connect() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:680: in connect self._get_server_information() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:1099: in _get_server_information packet = self._read_packet() ^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:751: in _read_packet packet_header = self._read_bytes(4) ^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = &lt;pymysql.connections.Connection object at 0x000001DC00A6ED20&gt; num_bytes = 4 def _read_bytes(self, num_bytes): self._sock.settimeout(self._read_timeout) while True: try: data = self._rfile.read(num_bytes) break except OSError as e: if e.errno == errno.EINTR: continue self._force_close() raise err.OperationalError( CR.CR_SERVER_LOST, f"Lost connection to MySQL server during query ({e})", ) except BaseException: # Don't convert unknown exception to MySQLError. self._force_close() raise if len(data) &lt; num_bytes: self._force_close() &gt; raise err.OperationalError( CR.CR_SERVER_LOST, "Lost connection to MySQL server during query" ) E sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') E (Background on this error at: https://sqlalche.me/e/20/e3q8) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:805: OperationalError During handling of the above exception, another exception occurred: client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } &gt; resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:147: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:398: in upload_document inc_db_error("insert_document") observability.py:312: in inc_db_error DB_ERRORS.inc(op) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = CounterMetric(name='tatou_db_errors_total', help='Database operation errors', values={}, label_names=('operation',)) amount = 1.0, label_values = ('insert_document',) def inc(self, *label_values: str, amount: float = 1.0) -&gt; None: if len(label_values) is len(self.label_names): # defensive &gt; raise ValueError("Label cardinality mismatch") E ValueError: Label cardinality mismatch observability.py:38: ValueError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: Label cardinality mismatch ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T175152555283Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: Label cardinality mismatch WARNING server:server.py:486 Document not found or access denied for id=1 WARNING server:server.py:160 after_request instrumentation failed: Label cardinality mismatch ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: Label cardinality mismatch WARNING server:server.py:610 Document not found or access denied for id=1 WARNING server:server.py:160 after_request instrumentation failed: Label cardinality mismatch _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: Label cardinality mismatch WARNING server:server.py:972 Document not found or access denied for watermarking id=1 WARNING server:server.py:160 after_request instrumentation failed: Label cardinality mismatch __________________________ test_read_watermark_route __________________________ self = &lt;sqlalchemy.engine.base.Connection object at 0x000001DC00E06210&gt; dialect = &lt;sqlalchemy.dialects.mysql.pymysql.MySQLDialect_pymysql object at 0x000001DC00E06750&gt; context = &lt;sqlalchemy.dialects.mysql.mysqldb.MySQLExecutionContext_mysqldb object at 0x000001DC00E06AB0&gt; statement = &lt;sqlalchemy.dialects.mysql.mysqldb.MySQLCompiler_mysqldb object at 0x000001DC00E06B10&gt; parameters = [{'name': 'Water File', 'ownerid': 1, 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storag...175153955789Z__watermarked.pdf', 'sha256hex': '5fbac867f5efdd7b0ab5c11456b204ddd08ff8801502c93728be3b38bfafe80c', ...}] def _exec_single_context( self, dialect: Dialect, context: ExecutionContext, statement: Union[str, Compiled], parameters: Optional[_AnyMultiExecuteParams], ) -&gt; CursorResult[Any]: """continue the _execute_context() method for a single DBAPI cursor.execute() or cursor.executemany() call. """ if dialect.bind_typing is BindTyping.SETINPUTSIZES: generic_setinputsizes = context._prepare_set_input_sizes() if generic_setinputsizes: try: dialect.do_set_input_sizes( context.cursor, generic_setinputsizes, context ) except BaseException as e: self._handle_dbapi_exception( e, str(statement), parameters, None, context ) cursor, str_statement, parameters = ( context.cursor, context.statement, context.parameters, ) effective_parameters: Optional[_AnyExecuteParams] if not context.executemany: effective_parameters = parameters[0] else: effective_parameters = parameters if self._has_events or self.engine._has_events: for fn in self.dispatch.before_cursor_execute: str_statement, effective_parameters = fn( self, cursor, str_statement, effective_parameters, context, context.executemany, ) if self._echo: self._log_info(str_statement) stats = context._get_cache_stats() if not self.engine.hide_parameters: self._log_info( "[%s] %r", stats, sql_util._repr_params( effective_parameters, batches=10, ismulti=context.executemany, ), ) else: self._log_info( "[%s] [SQL parameters hidden due to hide_parameters=True]", stats, ) evt_handled: bool = False try: if context.execute_style is ExecuteStyle.EXECUTEMANY: effective_parameters = cast( "_CoreMultiExecuteParams", effective_parameters ) if self.dialect._has_events: for fn in self.dialect.dispatch.do_executemany: if fn( cursor, str_statement, effective_parameters, context, ): evt_handled = True break if not evt_handled: self.dialect.do_executemany( cursor, str_statement, effective_parameters, context, ) elif not effective_parameters and context.no_parameters: if self.dialect._has_events: for fn in self.dialect.dispatch.do_execute_no_params: if fn(cursor, str_statement, context): evt_handled = True break if not evt_handled: self.dialect.do_execute_no_params( cursor, str_statement, context ) else: effective_parameters = cast( "_CoreSingleExecuteParams", effective_parameters ) if self.dialect._has_events: for fn in self.dialect.dispatch.do_execute: if fn( cursor, str_statement, effective_parameters, context, ): evt_handled = True break if not evt_handled: &gt; self.dialect.do_execute( cursor, str_statement, effective_parameters, context ) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:1967: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\default.py:951: in do_execute cursor.execute(statement, parameters) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\cursors.py:153: in execute result = self._query(query) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\cursors.py:322: in _query conn.query(q) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:575: in query self._affected_rows = self._read_query_result(unbuffered=unbuffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:826: in _read_query_result result.read() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:1203: in read first_packet = self.connection._read_packet() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:782: in _read_packet packet.raise_for_error() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\protocol.py:219: in raise_for_error err.raise_mysql_exception(self._data) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ data = b'\xff\xac\x05#23000Cannot add or update a child row: a foreign key constraint fails (`tatou`.`Documents`, CONSTRAINT `fk_documents_owner` FOREIGN KEY (`ownerid`) REFERENCES `Users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)' def raise_mysql_exception(data): errno = struct.unpack("&lt;h", data[1:3])[0] # https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_basic_err_packet.html # Error packet has optional sqlstate that is 5 bytes and starts with '#'. if data[3] == 0x23: # '#' # sqlstate = data[4:9].decode() # TODO: Append (sqlstate) in the error message. This will be come in next minor release. errval = data[9:].decode("utf-8", "replace") else: errval = data[3:].decode("utf-8", "replace") errorclass = error_map.get(errno) if errorclass is None: errorclass = InternalError if errno &lt; 1000 else OperationalError &gt; raise errorclass(errno, errval) E pymysql.err.IntegrityError: (1452, 'Cannot add or update a child row: a foreign key constraint fails (`tatou`.`Documents`, CONSTRAINT `fk_documents_owner` FOREIGN KEY (`ownerid`) REFERENCES `Users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)') C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\err.py:150: IntegrityError The above exception was the direct cause of the following exception: @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 user_dir = app.config["STORAGE_DIR"] / "files" / g.user["login"] user_dir.mkdir(parents=True, exist_ok=True) ts = dt.datetime.now(dt.UTC).strftime("%Y%m%dT%H%M%S%fZ") final_name = request.form.get("name") or fname stored_name = f"{ts}__{fname}" try: # Check for path traversal attempts stored_path = (user_dir / stored_name).resolve() if not str(stored_path).startswith(str(user_dir.resolve())): app.logger.warning("Upload attempt with invalid path: %s", stored_path) return jsonify({"error": "invalid path"}), 400 file.save(stored_path) except Exception as e: app.logger.error("File save error: %s", e) return jsonify({"error": "failed to save file"}), 500 sha_hex = _sha256_file(stored_path) size = stored_path.stat().st_size try: with get_engine().begin() as conn: &gt; conn.execute( text( """ INSERT INTO Documents (name, path, ownerid, sha256, size) VALUES (:name, :path, :ownerid, UNHEX(:sha256hex), :size) """ ), { "name": final_name, "path": str(stored_path), "ownerid": int(g.user["id"]), "sha256hex": sha_hex, "size": int(size), }, ) server.py:365: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:1419: in execute return meth( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\sql\elements.py:526: in _execute_on_connection return connection._execute_clauseelement( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:1641: in _execute_clauseelement ret = self._execute_context( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:1846: in _execute_context return self._exec_single_context( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:1986: in _exec_single_context self._handle_dbapi_exception( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:2355: in _handle_dbapi_exception raise sqlalchemy_exception.with_traceback(exc_info[2]) from e C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:1967: in _exec_single_context self.dialect.do_execute( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\default.py:951: in do_execute cursor.execute(statement, parameters) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\cursors.py:153: in execute result = self._query(query) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\cursors.py:322: in _query conn.query(q) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:575: in query self._affected_rows = self._read_query_result(unbuffered=unbuffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:826: in _read_query_result result.read() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:1203: in read first_packet = self.connection._read_packet() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:782: in _read_packet packet.raise_for_error() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\protocol.py:219: in raise_for_error err.raise_mysql_exception(self._data) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ data = b'\xff\xac\x05#23000Cannot add or update a child row: a foreign key constraint fails (`tatou`.`Documents`, CONSTRAINT `fk_documents_owner` FOREIGN KEY (`ownerid`) REFERENCES `Users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)' def raise_mysql_exception(data): errno = struct.unpack("&lt;h", data[1:3])[0] # https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_basic_err_packet.html # Error packet has optional sqlstate that is 5 bytes and starts with '#'. if data[3] == 0x23: # '#' # sqlstate = data[4:9].decode() # TODO: Append (sqlstate) in the error message. This will be come in next minor release. errval = data[9:].decode("utf-8", "replace") else: errval = data[3:].decode("utf-8", "replace") errorclass = error_map.get(errno) if errorclass is None: errorclass = InternalError if errno &lt; 1000 else OperationalError &gt; raise errorclass(errno, errval) E sqlalchemy.exc.IntegrityError: (pymysql.err.IntegrityError) (1452, 'Cannot add or update a child row: a foreign key constraint fails (`tatou`.`Documents`, CONSTRAINT `fk_documents_owner` FOREIGN KEY (`ownerid`) REFERENCES `Users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)') E [SQL: E INSERT INTO Documents (name, path, ownerid, sha256, size) E VALUES (%(name)s, %(path)s, %(ownerid)s, UNHEX(%(sha256hex)s), %(size)s) E ] E [parameters: {'name': 'Water File', 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username\\20251016T175153955789Z__watermarked.pdf', 'ownerid': 1, 'sha256hex': '5fbac867f5efdd7b0ab5c11456b204ddd08ff8801502c93728be3b38bfafe80c', 'size': 39265}] E (Background on this error at: https://sqlalche.me/e/20/gkpj) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\err.py:150: IntegrityError During handling of the above exception, another exception occurred: client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } &gt; upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:387: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:398: in upload_document inc_db_error("insert_document") observability.py:312: in inc_db_error DB_ERRORS.inc(op) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = CounterMetric(name='tatou_db_errors_total', help='Database operation errors', values={}, label_names=('operation',)) amount = 1.0, label_values = ('insert_document',) def inc(self, *label_values: str, amount: float = 1.0) -&gt; None: if len(label_values) is len(self.label_names): # defensive &gt; raise ValueError("Label cardinality mismatch") E ValueError: Label cardinality mismatch observability.py:38: ValueError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: Label cardinality mismatch ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T175153955789Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: Label cardinality mismatch WARNING server:server.py:850 Document not found or access denied for deletion id=2 WARNING server:server.py:160 after_request instrumentation failed: Label cardinality mismatch ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - ValueError: Label cardinality ... FAILED ..\test\test_api.py::test_upload_document_route - ValueError: Label ca... FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - ValueError: Label car... FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 20.76s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1058"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1058_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1058_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1058_1"><button class="btn btn-outline-success"><span class="job_id">1058 : Job ID d96b9566a1d94ee5bdc55707aac707dc</span></button></div></a><div aria-labelledby="job_list___sub_heading_1058_1" data-parent="#job_list___sub_accordion_1058" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1058_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=65" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (65, 29), end pos: (65, 31)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_Is, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -62,7 +62,7 @@ sums: dict[tuple[str, ...], float] def observe(self, value: float, *label_values: str) -&gt; None: - if len(label_values) != len(self.label_names): + if len(label_values) is len(self.label_names): raise ValueError("Label cardinality mismatch") labels = tuple(label_values) # Increment every bucket whose upper bound is &gt;= value so that</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: Label cardinality mismatch ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) WARNING server:server.py:160 after_request instrumentation failed: Label cardinality mismatch ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: Label cardinality mismatch ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) WARNING server:server.py:160 after_request instrumentation failed: Label cardinality mismatch _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: Label cardinality mismatch ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T192229009490Z__input.pdf user=1 WARNING server:server.py:160 after_request instrumentation failed: Label cardinality mismatch __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 WARNING server:server.py:160 after_request instrumentation failed: Label cardinality mismatch __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 WARNING server:server.py:160 after_request instrumentation failed: Label cardinality mismatch ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 WARNING server:server.py:160 after_request instrumentation failed: Label cardinality mismatch ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 WARNING server:server.py:160 after_request instrumentation failed: Label cardinality mismatch _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: Label cardinality mismatch WARNING server:server.py:972 Document not found or access denied for watermarking id=1 WARNING server:server.py:160 after_request instrumentation failed: Label cardinality mismatch __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: Label cardinality mismatch ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T192229912159Z__watermarked.pdf user=1 WARNING server:server.py:160 after_request instrumentation failed: Label cardinality mismatch _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: Label cardinality mismatch WARNING server:server.py:850 Document not found or access denied for deletion id=2 WARNING server:server.py:160 after_request instrumentation failed: Label cardinality mismatch ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.71s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1059"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1059_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1059_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1059_1"><button class="btn btn-outline-danger"><span class="job_id">1059 : Job ID 948e09869b324976aa5afd3c756e0882</span></button></div></a><div aria-labelledby="job_list___sub_heading_1059_1" data-parent="#job_list___sub_accordion_1059" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1059_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=37" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (37, 29), end pos: (37, 31)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_IsNot, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -34,7 +34,7 @@ label_names: tuple[str, ...] def inc(self, *label_values: str, amount: float = 1.0) -&gt; None: - if len(label_values) != len(self.label_names): # defensive + if len(label_values) is not len(self.label_names): # defensive raise ValueError("Label cardinality mismatch") key = tuple(label_values) self.values[key] = self.values.get(key, 0.0) + amount</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.99s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1060"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1060_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1060_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1060_1"><button class="btn btn-outline-danger"><span class="job_id">1060 : Job ID adf1df5b77fc4c8c9f84b11c2b8f790c</span></button></div></a><div aria-labelledby="job_list___sub_heading_1060_1" data-parent="#job_list___sub_accordion_1060" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1060_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=65" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (65, 29), end pos: (65, 31)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_IsNot, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -62,7 +62,7 @@ sums: dict[tuple[str, ...], float] def observe(self, value: float, *label_values: str) -&gt; None: - if len(label_values) != len(self.label_names): + if len(label_values) is not len(self.label_names): raise ValueError("Label cardinality mismatch") labels = tuple(label_values) # Increment every bucket whose upper bound is &gt;= value so that</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.07s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1061"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1061_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1061_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1061_1"><button class="btn btn-outline-danger"><span class="job_id">1061 : Job ID eb08a2d8b36445868dab698163e1856a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1061_1" data-parent="#job_list___sub_accordion_1061" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1061_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=263" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (263, 28), end pos: (263, 29)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Lt_Eq, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -260,7 +260,7 @@ def observe_request_size(method: str, route: str, size: int | None) -&gt; None: - if size is None or size &lt; 0: + if size is None or size == 0: return with _lock: REQUEST_BODY_SIZE.observe(float(size), method, route)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.15s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1062"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1062_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1062_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1062_1"><button class="btn btn-outline-danger"><span class="job_id">1062 : Job ID 41852a81843f40c480b6568b2ade5858</span></button></div></a><div aria-labelledby="job_list___sub_heading_1062_1" data-parent="#job_list___sub_accordion_1062" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1062_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=263" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (263, 28), end pos: (263, 29)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Lt_NotEq, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -260,7 +260,7 @@ def observe_request_size(method: str, route: str, size: int | None) -&gt; None: - if size is None or size &lt; 0: + if size is None or size != 0: return with _lock: REQUEST_BODY_SIZE.observe(float(size), method, route)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.53s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1063"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1063_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1063_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1063_1"><button class="btn btn-outline-success"><span class="job_id">1063 : Job ID cf0bbfc910d9447284679089785044fa</span></button></div></a><div aria-labelledby="job_list___sub_heading_1063_1" data-parent="#job_list___sub_accordion_1063" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1063_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=263" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (263, 28), end pos: (263, 29)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Lt_LtE, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -260,7 +260,7 @@ def observe_request_size(method: str, route: str, size: int | None) -&gt; None: - if size is None or size &lt; 0: + if size is None or size &lt;= 0: return with _lock: REQUEST_BODY_SIZE.observe(float(size), method, route)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T023723717472Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T023724611190Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.21s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1064"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1064_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1064_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1064_1"><button class="btn btn-outline-danger"><span class="job_id">1064 : Job ID c05df35481bc4f39bd5404fa736c67b7</span></button></div></a><div aria-labelledby="job_list___sub_heading_1064_1" data-parent="#job_list___sub_accordion_1064" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1064_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=263" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (263, 28), end pos: (263, 29)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Lt_Gt, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -260,7 +260,7 @@ def observe_request_size(method: str, route: str, size: int | None) -&gt; None: - if size is None or size &lt; 0: + if size is None or size &gt; 0: return with _lock: REQUEST_BODY_SIZE.observe(float(size), method, route)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.23s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1065"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1065_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1065_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1065_1"><button class="btn btn-outline-success"><span class="job_id">1065 : Job ID 0180ccd113ea45bf918822821c823c98</span></button></div></a><div aria-labelledby="job_list___sub_heading_1065_1" data-parent="#job_list___sub_accordion_1065" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1065_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=263" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (263, 28), end pos: (263, 29)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Lt_GtE, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -260,7 +260,7 @@ def observe_request_size(method: str, route: str, size: int | None) -&gt; None: - if size is None or size &lt; 0: + if size is None or size &gt;= 0: return with _lock: REQUEST_BODY_SIZE.observe(float(size), method, route)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T054504182837Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T054505131153Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 20.45s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1066"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1066_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1066_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1066_1"><button class="btn btn-outline-success"><span class="job_id">1066 : Job ID 7981b35beebc4480b2a1c5de635f3acd</span></button></div></a><div aria-labelledby="job_list___sub_heading_1066_1" data-parent="#job_list___sub_accordion_1066" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1066_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=71" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (71, 21), end pos: (71, 23)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_LtE_Eq, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -68,7 +68,7 @@ # Increment every bucket whose upper bound is &gt;= value so that # stored counts are already cumulative (Prometheus expectation). for b in self.buckets: - if value &lt;= b: + if value == b: self.counts[(labels, b)] = self.counts.get((labels, b), 0) + 1 # Always increment +Inf bucket count inf_key = (labels, float("inf"))</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ebbdbac663ed3905c: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 21.64s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1067"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1067_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1067_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1067_1"><button class="btn btn-outline-success"><span class="job_id">1067 : Job ID 921f14c9ff3f4dc086a75bbb20bdc834</span></button></div></a><div aria-labelledby="job_list___sub_heading_1067_1" data-parent="#job_list___sub_accordion_1067" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1067_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=71" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (71, 21), end pos: (71, 23)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_LtE_NotEq, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -68,7 +68,7 @@ # Increment every bucket whose upper bound is &gt;= value so that # stored counts are already cumulative (Prometheus expectation). for b in self.buckets: - if value &lt;= b: + if value != b: self.counts[(labels, b)] = self.counts.get((labels, b), 0) + 1 # Always increment +Inf bucket count inf_key = (labels, float("inf"))</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T012904950759Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T012905942421Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.47s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1068"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1068_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1068_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1068_1"><button class="btn btn-outline-success"><span class="job_id">1068 : Job ID 6f39c2d146334e6980a12474627aa19f</span></button></div></a><div aria-labelledby="job_list___sub_heading_1068_1" data-parent="#job_list___sub_accordion_1068" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1068_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=71" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (71, 21), end pos: (71, 23)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_LtE_Lt, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -68,7 +68,7 @@ # Increment every bucket whose upper bound is &gt;= value so that # stored counts are already cumulative (Prometheus expectation). for b in self.buckets: - if value &lt;= b: + if value &lt; b: self.counts[(labels, b)] = self.counts.get((labels, b), 0) + 1 # Always increment +Inf bucket count inf_key = (labels, float("inf"))</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T141808610287Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T141809407367Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.95s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1069"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1069_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1069_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1069_1"><button class="btn btn-outline-danger"><span class="job_id">1069 : Job ID 5eb379a564d54d0588c8b76abe26c8c1</span></button></div></a><div aria-labelledby="job_list___sub_heading_1069_1" data-parent="#job_list___sub_accordion_1069" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1069_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=71" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (71, 21), end pos: (71, 23)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_LtE_Gt, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -68,7 +68,7 @@ # Increment every bucket whose upper bound is &gt;= value so that # stored counts are already cumulative (Prometheus expectation). for b in self.buckets: - if value &lt;= b: + if value &gt; b: self.counts[(labels, b)] = self.counts.get((labels, b), 0) + 1 # Always increment +Inf bucket count inf_key = (labels, float("inf"))</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.24s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1070"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1070_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1070_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1070_1"><button class="btn btn-outline-danger"><span class="job_id">1070 : Job ID d699e1284bc2481a9639438c368cab43</span></button></div></a><div aria-labelledby="job_list___sub_heading_1070_1" data-parent="#job_list___sub_accordion_1070" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1070_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=71" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (71, 21), end pos: (71, 23)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_LtE_GtE, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -68,7 +68,7 @@ # Increment every bucket whose upper bound is &gt;= value so that # stored counts are already cumulative (Prometheus expectation). for b in self.buckets: - if value &lt;= b: + if value &gt;= b: self.counts[(labels, b)] = self.counts.get((labels, b), 0) + 1 # Always increment +Inf bucket count inf_key = (labels, float("inf"))</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.11s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1071"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1071_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1071_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1071_1"><button class="btn btn-outline-success"><span class="job_id">1071 : Job ID 90809a1fcba3418fae864a2c764e6e6c</span></button></div></a><div aria-labelledby="job_list___sub_heading_1071_1" data-parent="#job_list___sub_accordion_1071" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1071_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=71" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (71, 21), end pos: (71, 23)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_LtE_Is, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -68,7 +68,7 @@ # Increment every bucket whose upper bound is &gt;= value so that # stored counts are already cumulative (Prometheus expectation). for b in self.buckets: - if value &lt;= b: + if value is b: self.counts[(labels, b)] = self.counts.get((labels, b), 0) + 1 # Always increment +Inf bucket count inf_key = (labels, float("inf"))</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T185749239791Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T185750109286Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.83s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1072"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1072_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1072_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1072_1"><button class="btn btn-outline-danger"><span class="job_id">1072 : Job ID 7eee3db3ab0e41389c9a77c87cf81c4f</span></button></div></a><div aria-labelledby="job_list___sub_heading_1072_1" data-parent="#job_list___sub_accordion_1072" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1072_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=71" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (71, 21), end pos: (71, 23)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_LtE_IsNot, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -68,7 +68,7 @@ # Increment every bucket whose upper bound is &gt;= value so that # stored counts are already cumulative (Prometheus expectation). for b in self.buckets: - if value &lt;= b: + if value is not b: self.counts[(labels, b)] = self.counts.get((labels, b), 0) + 1 # Always increment +Inf bucket count inf_key = (labels, float("inf"))</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.61s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1073"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1073_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1073_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1073_1"><button class="btn btn-outline-danger"><span class="job_id">1073 : Job ID 76e0f56d49cc444691aecf5a2712d313</span></button></div></a><div aria-labelledby="job_list___sub_heading_1073_1" data-parent="#job_list___sub_accordion_1073" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1073_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=263" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (263, 12), end pos: (263, 14)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Is_IsNot, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -260,7 +260,7 @@ def observe_request_size(method: str, route: str, size: int | None) -&gt; None: - if size is None or size &lt; 0: + if size is not None or size &lt; 0: return with _lock: REQUEST_BODY_SIZE.observe(float(size), method, route)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.58s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1074"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1074_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1074_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1074_1"><button class="btn btn-outline-success"><span class="job_id">1074 : Job ID 92495813e6c541f28ca64919de75fd31</span></button></div></a><div aria-labelledby="job_list___sub_heading_1074_1" data-parent="#job_list___sub_accordion_1074" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1074_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=37" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (37, 11), end pos: (37, 53)</button></a></pre><pre>operator: core/AddNot, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -34,7 +34,7 @@ label_names: tuple[str, ...] def inc(self, *label_values: str, amount: float = 1.0) -&gt; None: - if len(label_values) != len(self.label_names): # defensive + if not len(label_values) != len(self.label_names): # defensive raise ValueError("Label cardinality mismatch") key = tuple(label_values) self.values[key] = self.values.get(key, 0.0) + amount</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: Label cardinality mismatch ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) WARNING server:server.py:160 after_request instrumentation failed: Label cardinality mismatch ______________________________ test_login_route _______________________________ @app.post("/api/login") def login(): payload = request.get_json(silent=True) or {} email = (payload.get("email") or "").strip() password = payload.get("password") or "" if not email or not password: app.logger.warning("Missing fields in login attempt: %s", payload) return jsonify({"error": "email and password are required"}), 400 start_db = time.time() try: with get_engine().connect() as conn: row = conn.execute( text( "SELECT id, email, login, hpassword FROM Users " "WHERE email = :email LIMIT 1" ), {"email": email}, ).first() # Constant-time comparison to prevent timing attacks if row: is_valid = check_password_hash(row.hpassword, password) else: # Dummy check to maintain constant time is_valid = False row = None if not is_valid: app.logger.warning( "Failed login attempt for email: %s", email if email else "&lt;empty&gt;", ) &gt; inc_login_failure("invalid_credentials") server.py:276: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ observability.py:271: in inc_login_failure LOGIN_FAILURES.inc(reason) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = CounterMetric(name='tatou_login_failures_total', help='Number of failed login attempts', values={}, label_names=('reason',)) amount = 1.0, label_values = ('invalid_credentials',) def inc(self, *label_values: str, amount: float = 1.0) -&gt; None: if not len(label_values) != len(self.label_names): # defensive &gt; raise ValueError("Label cardinality mismatch") E ValueError: Label cardinality mismatch observability.py:38: ValueError During handling of the above exception, another exception occurred: client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret &gt; resp = client.post("/api/login", json=parameters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:111: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:281: in login inc_db_error("login_select") observability.py:312: in inc_db_error DB_ERRORS.inc(op) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = CounterMetric(name='tatou_db_errors_total', help='Database operation errors', values={}, label_names=('operation',)) amount = 1.0, label_values = ('login_select',) def inc(self, *label_values: str, amount: float = 1.0) -&gt; None: if not len(label_values) != len(self.label_names): # defensive &gt; raise ValueError("Label cardinality mismatch") E ValueError: Label cardinality mismatch observability.py:38: ValueError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: Label cardinality mismatch WARNING server:server.py:272 Failed login attempt for email: user@email.se ERROR server:server.py:280 Database error in login: Label cardinality mismatch _________________________ test_upload_document_route __________________________ self = &lt;sqlalchemy.engine.base.Connection object at 0x000001F6AB04ED80&gt; dialect = &lt;sqlalchemy.dialects.mysql.pymysql.MySQLDialect_pymysql object at 0x000001F6AB04F290&gt; context = &lt;sqlalchemy.dialects.mysql.mysqldb.MySQLExecutionContext_mysqldb object at 0x000001F6AB04F740&gt; statement = &lt;sqlalchemy.dialects.mysql.mysqldb.MySQLCompiler_mysqldb object at 0x000001F6AB04EED0&gt; parameters = [{'name': 'My File', 'ownerid': 1, 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\...51016T163905268469Z__input.pdf', 'sha256hex': '5fbac867f5efdd7b0ab5c11456b204ddd08ff8801502c93728be3b38bfafe80c', ...}] def _exec_single_context( self, dialect: Dialect, context: ExecutionContext, statement: Union[str, Compiled], parameters: Optional[_AnyMultiExecuteParams], ) -&gt; CursorResult[Any]: """continue the _execute_context() method for a single DBAPI cursor.execute() or cursor.executemany() call. """ if dialect.bind_typing is BindTyping.SETINPUTSIZES: generic_setinputsizes = context._prepare_set_input_sizes() if generic_setinputsizes: try: dialect.do_set_input_sizes( context.cursor, generic_setinputsizes, context ) except BaseException as e: self._handle_dbapi_exception( e, str(statement), parameters, None, context ) cursor, str_statement, parameters = ( context.cursor, context.statement, context.parameters, ) effective_parameters: Optional[_AnyExecuteParams] if not context.executemany: effective_parameters = parameters[0] else: effective_parameters = parameters if self._has_events or self.engine._has_events: for fn in self.dispatch.before_cursor_execute: str_statement, effective_parameters = fn( self, cursor, str_statement, effective_parameters, context, context.executemany, ) if self._echo: self._log_info(str_statement) stats = context._get_cache_stats() if not self.engine.hide_parameters: self._log_info( "[%s] %r", stats, sql_util._repr_params( effective_parameters, batches=10, ismulti=context.executemany, ), ) else: self._log_info( "[%s] [SQL parameters hidden due to hide_parameters=True]", stats, ) evt_handled: bool = False try: if context.execute_style is ExecuteStyle.EXECUTEMANY: effective_parameters = cast( "_CoreMultiExecuteParams", effective_parameters ) if self.dialect._has_events: for fn in self.dialect.dispatch.do_executemany: if fn( cursor, str_statement, effective_parameters, context, ): evt_handled = True break if not evt_handled: self.dialect.do_executemany( cursor, str_statement, effective_parameters, context, ) elif not effective_parameters and context.no_parameters: if self.dialect._has_events: for fn in self.dialect.dispatch.do_execute_no_params: if fn(cursor, str_statement, context): evt_handled = True break if not evt_handled: self.dialect.do_execute_no_params( cursor, str_statement, context ) else: effective_parameters = cast( "_CoreSingleExecuteParams", effective_parameters ) if self.dialect._has_events: for fn in self.dialect.dispatch.do_execute: if fn( cursor, str_statement, effective_parameters, context, ): evt_handled = True break if not evt_handled: &gt; self.dialect.do_execute( cursor, str_statement, effective_parameters, context ) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:1967: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\default.py:951: in do_execute cursor.execute(statement, parameters) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\cursors.py:153: in execute result = self._query(query) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\cursors.py:322: in _query conn.query(q) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:575: in query self._affected_rows = self._read_query_result(unbuffered=unbuffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:826: in _read_query_result result.read() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:1203: in read first_packet = self.connection._read_packet() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:782: in _read_packet packet.raise_for_error() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\protocol.py:219: in raise_for_error err.raise_mysql_exception(self._data) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ data = b'\xff\xac\x05#23000Cannot add or update a child row: a foreign key constraint fails (`tatou`.`Documents`, CONSTRAINT `fk_documents_owner` FOREIGN KEY (`ownerid`) REFERENCES `Users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)' def raise_mysql_exception(data): errno = struct.unpack("&lt;h", data[1:3])[0] # https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_basic_err_packet.html # Error packet has optional sqlstate that is 5 bytes and starts with '#'. if data[3] == 0x23: # '#' # sqlstate = data[4:9].decode() # TODO: Append (sqlstate) in the error message. This will be come in next minor release. errval = data[9:].decode("utf-8", "replace") else: errval = data[3:].decode("utf-8", "replace") errorclass = error_map.get(errno) if errorclass is None: errorclass = InternalError if errno &lt; 1000 else OperationalError &gt; raise errorclass(errno, errval) E pymysql.err.IntegrityError: (1452, 'Cannot add or update a child row: a foreign key constraint fails (`tatou`.`Documents`, CONSTRAINT `fk_documents_owner` FOREIGN KEY (`ownerid`) REFERENCES `Users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)') C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\err.py:150: IntegrityError The above exception was the direct cause of the following exception: @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 user_dir = app.config["STORAGE_DIR"] / "files" / g.user["login"] user_dir.mkdir(parents=True, exist_ok=True) ts = dt.datetime.now(dt.UTC).strftime("%Y%m%dT%H%M%S%fZ") final_name = request.form.get("name") or fname stored_name = f"{ts}__{fname}" try: # Check for path traversal attempts stored_path = (user_dir / stored_name).resolve() if not str(stored_path).startswith(str(user_dir.resolve())): app.logger.warning("Upload attempt with invalid path: %s", stored_path) return jsonify({"error": "invalid path"}), 400 file.save(stored_path) except Exception as e: app.logger.error("File save error: %s", e) return jsonify({"error": "failed to save file"}), 500 sha_hex = _sha256_file(stored_path) size = stored_path.stat().st_size try: with get_engine().begin() as conn: &gt; conn.execute( text( """ INSERT INTO Documents (name, path, ownerid, sha256, size) VALUES (:name, :path, :ownerid, UNHEX(:sha256hex), :size) """ ), { "name": final_name, "path": str(stored_path), "ownerid": int(g.user["id"]), "sha256hex": sha_hex, "size": int(size), }, ) server.py:365: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:1419: in execute return meth( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\sql\elements.py:526: in _execute_on_connection return connection._execute_clauseelement( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:1641: in _execute_clauseelement ret = self._execute_context( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:1846: in _execute_context return self._exec_single_context( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:1986: in _exec_single_context self._handle_dbapi_exception( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:2355: in _handle_dbapi_exception raise sqlalchemy_exception.with_traceback(exc_info[2]) from e C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:1967: in _exec_single_context self.dialect.do_execute( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\default.py:951: in do_execute cursor.execute(statement, parameters) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\cursors.py:153: in execute result = self._query(query) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\cursors.py:322: in _query conn.query(q) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:575: in query self._affected_rows = self._read_query_result(unbuffered=unbuffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:826: in _read_query_result result.read() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:1203: in read first_packet = self.connection._read_packet() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:782: in _read_packet packet.raise_for_error() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\protocol.py:219: in raise_for_error err.raise_mysql_exception(self._data) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ data = b'\xff\xac\x05#23000Cannot add or update a child row: a foreign key constraint fails (`tatou`.`Documents`, CONSTRAINT `fk_documents_owner` FOREIGN KEY (`ownerid`) REFERENCES `Users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)' def raise_mysql_exception(data): errno = struct.unpack("&lt;h", data[1:3])[0] # https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_basic_err_packet.html # Error packet has optional sqlstate that is 5 bytes and starts with '#'. if data[3] == 0x23: # '#' # sqlstate = data[4:9].decode() # TODO: Append (sqlstate) in the error message. This will be come in next minor release. errval = data[9:].decode("utf-8", "replace") else: errval = data[3:].decode("utf-8", "replace") errorclass = error_map.get(errno) if errorclass is None: errorclass = InternalError if errno &lt; 1000 else OperationalError &gt; raise errorclass(errno, errval) E sqlalchemy.exc.IntegrityError: (pymysql.err.IntegrityError) (1452, 'Cannot add or update a child row: a foreign key constraint fails (`tatou`.`Documents`, CONSTRAINT `fk_documents_owner` FOREIGN KEY (`ownerid`) REFERENCES `Users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)') E [SQL: E INSERT INTO Documents (name, path, ownerid, sha256, size) E VALUES (%(name)s, %(path)s, %(ownerid)s, UNHEX(%(sha256hex)s), %(size)s) E ] E [parameters: {'name': 'My File', 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username\\20251016T163905268469Z__input.pdf', 'ownerid': 1, 'sha256hex': '5fbac867f5efdd7b0ab5c11456b204ddd08ff8801502c93728be3b38bfafe80c', 'size': 39265}] E (Background on this error at: https://sqlalche.me/e/20/gkpj) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\err.py:150: IntegrityError During handling of the above exception, another exception occurred: client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } &gt; resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:147: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:398: in upload_document inc_db_error("insert_document") observability.py:312: in inc_db_error DB_ERRORS.inc(op) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = CounterMetric(name='tatou_db_errors_total', help='Database operation errors', values={}, label_names=('operation',)) amount = 1.0, label_values = ('insert_document',) def inc(self, *label_values: str, amount: float = 1.0) -&gt; None: if not len(label_values) != len(self.label_names): # defensive &gt; raise ValueError("Label cardinality mismatch") E ValueError: Label cardinality mismatch observability.py:38: ValueError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: Label cardinality mismatch ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T163905268469Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: Label cardinality mismatch WARNING server:server.py:486 Document not found or access denied for id=1 WARNING server:server.py:160 after_request instrumentation failed: Label cardinality mismatch ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: Label cardinality mismatch WARNING server:server.py:610 Document not found or access denied for id=1 WARNING server:server.py:160 after_request instrumentation failed: Label cardinality mismatch _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: Label cardinality mismatch WARNING server:server.py:972 Document not found or access denied for watermarking id=1 WARNING server:server.py:160 after_request instrumentation failed: Label cardinality mismatch __________________________ test_read_watermark_route __________________________ self = &lt;sqlalchemy.engine.base.Connection object at 0x000001F6AB107860&gt; dialect = &lt;sqlalchemy.dialects.mysql.pymysql.MySQLDialect_pymysql object at 0x000001F6AB107890&gt; context = &lt;sqlalchemy.dialects.mysql.mysqldb.MySQLExecutionContext_mysqldb object at 0x000001F6AB107FE0&gt; statement = &lt;sqlalchemy.dialects.mysql.mysqldb.MySQLCompiler_mysqldb object at 0x000001F6AB107E90&gt; parameters = [{'name': 'Water File', 'ownerid': 1, 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storag...163906690162Z__watermarked.pdf', 'sha256hex': '5fbac867f5efdd7b0ab5c11456b204ddd08ff8801502c93728be3b38bfafe80c', ...}] def _exec_single_context( self, dialect: Dialect, context: ExecutionContext, statement: Union[str, Compiled], parameters: Optional[_AnyMultiExecuteParams], ) -&gt; CursorResult[Any]: """continue the _execute_context() method for a single DBAPI cursor.execute() or cursor.executemany() call. """ if dialect.bind_typing is BindTyping.SETINPUTSIZES: generic_setinputsizes = context._prepare_set_input_sizes() if generic_setinputsizes: try: dialect.do_set_input_sizes( context.cursor, generic_setinputsizes, context ) except BaseException as e: self._handle_dbapi_exception( e, str(statement), parameters, None, context ) cursor, str_statement, parameters = ( context.cursor, context.statement, context.parameters, ) effective_parameters: Optional[_AnyExecuteParams] if not context.executemany: effective_parameters = parameters[0] else: effective_parameters = parameters if self._has_events or self.engine._has_events: for fn in self.dispatch.before_cursor_execute: str_statement, effective_parameters = fn( self, cursor, str_statement, effective_parameters, context, context.executemany, ) if self._echo: self._log_info(str_statement) stats = context._get_cache_stats() if not self.engine.hide_parameters: self._log_info( "[%s] %r", stats, sql_util._repr_params( effective_parameters, batches=10, ismulti=context.executemany, ), ) else: self._log_info( "[%s] [SQL parameters hidden due to hide_parameters=True]", stats, ) evt_handled: bool = False try: if context.execute_style is ExecuteStyle.EXECUTEMANY: effective_parameters = cast( "_CoreMultiExecuteParams", effective_parameters ) if self.dialect._has_events: for fn in self.dialect.dispatch.do_executemany: if fn( cursor, str_statement, effective_parameters, context, ): evt_handled = True break if not evt_handled: self.dialect.do_executemany( cursor, str_statement, effective_parameters, context, ) elif not effective_parameters and context.no_parameters: if self.dialect._has_events: for fn in self.dialect.dispatch.do_execute_no_params: if fn(cursor, str_statement, context): evt_handled = True break if not evt_handled: self.dialect.do_execute_no_params( cursor, str_statement, context ) else: effective_parameters = cast( "_CoreSingleExecuteParams", effective_parameters ) if self.dialect._has_events: for fn in self.dialect.dispatch.do_execute: if fn( cursor, str_statement, effective_parameters, context, ): evt_handled = True break if not evt_handled: &gt; self.dialect.do_execute( cursor, str_statement, effective_parameters, context ) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:1967: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\default.py:951: in do_execute cursor.execute(statement, parameters) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\cursors.py:153: in execute result = self._query(query) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\cursors.py:322: in _query conn.query(q) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:575: in query self._affected_rows = self._read_query_result(unbuffered=unbuffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:826: in _read_query_result result.read() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:1203: in read first_packet = self.connection._read_packet() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:782: in _read_packet packet.raise_for_error() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\protocol.py:219: in raise_for_error err.raise_mysql_exception(self._data) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ data = b'\xff\xac\x05#23000Cannot add or update a child row: a foreign key constraint fails (`tatou`.`Documents`, CONSTRAINT `fk_documents_owner` FOREIGN KEY (`ownerid`) REFERENCES `Users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)' def raise_mysql_exception(data): errno = struct.unpack("&lt;h", data[1:3])[0] # https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_basic_err_packet.html # Error packet has optional sqlstate that is 5 bytes and starts with '#'. if data[3] == 0x23: # '#' # sqlstate = data[4:9].decode() # TODO: Append (sqlstate) in the error message. This will be come in next minor release. errval = data[9:].decode("utf-8", "replace") else: errval = data[3:].decode("utf-8", "replace") errorclass = error_map.get(errno) if errorclass is None: errorclass = InternalError if errno &lt; 1000 else OperationalError &gt; raise errorclass(errno, errval) E pymysql.err.IntegrityError: (1452, 'Cannot add or update a child row: a foreign key constraint fails (`tatou`.`Documents`, CONSTRAINT `fk_documents_owner` FOREIGN KEY (`ownerid`) REFERENCES `Users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)') C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\err.py:150: IntegrityError The above exception was the direct cause of the following exception: @app.post("/api/upload-document") @require_auth def upload_document(): if "file" not in request.files: inc_suspicious("upload_missing_file_field") app.logger.warning("Upload attempt missing 'file' field") return jsonify({"error": "file is required (multipart/form-data)"}), 400 file = request.files["file"] if not file or file.filename == "": app.logger.warning("Upload attempt with empty filename") return jsonify({"error": "empty filename"}), 400 start_db = time.time() # Validate file size MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB if file.content_length and file.content_length &gt; MAX_FILE_SIZE: inc_suspicious("upload_oversize") app.logger.warning("Upload attempt with oversized file: %s", file.filename) return jsonify({"error": "file too large"}), 413 # Validate file type and MIME type if file.mimetype != "application/pdf": inc_suspicious("upload_bad_mime") app.logger.warning( "Upload attempt with invalid MIME type: %s", file.mimetype ) return jsonify({"error": "only PDF files are allowed"}), 415 if not file.filename.lower().endswith(".pdf"): inc_suspicious("upload_bad_extension") app.logger.warning( "Upload attempt with invalid file extension: %s", file.filename ) return jsonify({"error": "only PDF files are allowed"}), 415 # Sanitize filename fname = secure_filename(file.filename) if not fname: app.logger.warning( "Upload attempt with invalid filename: %s", file.filename ) return jsonify({"error": "invalid filename"}), 400 user_dir = app.config["STORAGE_DIR"] / "files" / g.user["login"] user_dir.mkdir(parents=True, exist_ok=True) ts = dt.datetime.now(dt.UTC).strftime("%Y%m%dT%H%M%S%fZ") final_name = request.form.get("name") or fname stored_name = f"{ts}__{fname}" try: # Check for path traversal attempts stored_path = (user_dir / stored_name).resolve() if not str(stored_path).startswith(str(user_dir.resolve())): app.logger.warning("Upload attempt with invalid path: %s", stored_path) return jsonify({"error": "invalid path"}), 400 file.save(stored_path) except Exception as e: app.logger.error("File save error: %s", e) return jsonify({"error": "failed to save file"}), 500 sha_hex = _sha256_file(stored_path) size = stored_path.stat().st_size try: with get_engine().begin() as conn: &gt; conn.execute( text( """ INSERT INTO Documents (name, path, ownerid, sha256, size) VALUES (:name, :path, :ownerid, UNHEX(:sha256hex), :size) """ ), { "name": final_name, "path": str(stored_path), "ownerid": int(g.user["id"]), "sha256hex": sha_hex, "size": int(size), }, ) server.py:365: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:1419: in execute return meth( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\sql\elements.py:526: in _execute_on_connection return connection._execute_clauseelement( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:1641: in _execute_clauseelement ret = self._execute_context( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:1846: in _execute_context return self._exec_single_context( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:1986: in _exec_single_context self._handle_dbapi_exception( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:2355: in _handle_dbapi_exception raise sqlalchemy_exception.with_traceback(exc_info[2]) from e C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\base.py:1967: in _exec_single_context self.dialect.do_execute( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\sqlalchemy\engine\default.py:951: in do_execute cursor.execute(statement, parameters) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\cursors.py:153: in execute result = self._query(query) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\cursors.py:322: in _query conn.query(q) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:575: in query self._affected_rows = self._read_query_result(unbuffered=unbuffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:826: in _read_query_result result.read() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:1203: in read first_packet = self.connection._read_packet() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\connections.py:782: in _read_packet packet.raise_for_error() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\protocol.py:219: in raise_for_error err.raise_mysql_exception(self._data) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ data = b'\xff\xac\x05#23000Cannot add or update a child row: a foreign key constraint fails (`tatou`.`Documents`, CONSTRAINT `fk_documents_owner` FOREIGN KEY (`ownerid`) REFERENCES `Users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)' def raise_mysql_exception(data): errno = struct.unpack("&lt;h", data[1:3])[0] # https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_basic_err_packet.html # Error packet has optional sqlstate that is 5 bytes and starts with '#'. if data[3] == 0x23: # '#' # sqlstate = data[4:9].decode() # TODO: Append (sqlstate) in the error message. This will be come in next minor release. errval = data[9:].decode("utf-8", "replace") else: errval = data[3:].decode("utf-8", "replace") errorclass = error_map.get(errno) if errorclass is None: errorclass = InternalError if errno &lt; 1000 else OperationalError &gt; raise errorclass(errno, errval) E sqlalchemy.exc.IntegrityError: (pymysql.err.IntegrityError) (1452, 'Cannot add or update a child row: a foreign key constraint fails (`tatou`.`Documents`, CONSTRAINT `fk_documents_owner` FOREIGN KEY (`ownerid`) REFERENCES `Users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)') E [SQL: E INSERT INTO Documents (name, path, ownerid, sha256, size) E VALUES (%(name)s, %(path)s, %(ownerid)s, UNHEX(%(sha256hex)s), %(size)s) E ] E [parameters: {'name': 'Water File', 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username\\20251016T163906690162Z__watermarked.pdf', 'ownerid': 1, 'sha256hex': '5fbac867f5efdd7b0ab5c11456b204ddd08ff8801502c93728be3b38bfafe80c', 'size': 39265}] E (Background on this error at: https://sqlalche.me/e/20/gkpj) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pymysql\err.py:150: IntegrityError During handling of the above exception, another exception occurred: client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } &gt; upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:387: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:398: in upload_document inc_db_error("insert_document") observability.py:312: in inc_db_error DB_ERRORS.inc(op) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = CounterMetric(name='tatou_db_errors_total', help='Database operation errors', values={}, label_names=('operation',)) amount = 1.0, label_values = ('insert_document',) def inc(self, *label_values: str, amount: float = 1.0) -&gt; None: if not len(label_values) != len(self.label_names): # defensive &gt; raise ValueError("Label cardinality mismatch") E ValueError: Label cardinality mismatch observability.py:38: ValueError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: Label cardinality mismatch ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T163906690162Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:149 before_request instrumentation failed: Label cardinality mismatch WARNING server:server.py:850 Document not found or access denied for deletion id=2 WARNING server:server.py:160 after_request instrumentation failed: Label cardinality mismatch ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - ValueError: Label cardinality ... FAILED ..\test\test_api.py::test_upload_document_route - ValueError: Label ca... FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - ValueError: Label car... FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 20.25s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1075"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1075_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1075_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1075_1"><button class="btn btn-outline-success"><span class="job_id">1075 : Job ID b462c12c1d474795902ce535f222f6d3</span></button></div></a><div aria-labelledby="job_list___sub_heading_1075_1" data-parent="#job_list___sub_accordion_1075" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1075_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=65" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (65, 11), end pos: (65, 53)</button></a></pre><pre>operator: core/AddNot, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -62,7 +62,7 @@ sums: dict[tuple[str, ...], float] def observe(self, value: float, *label_values: str) -&gt; None: - if len(label_values) != len(self.label_names): + if not len(label_values) != len(self.label_names): raise ValueError("Label cardinality mismatch") labels = tuple(label_values) # Increment every bucket whose upper bound is &gt;= value so that</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.....FF... [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: Label cardinality mismatch ERROR server:server.py:236 Database error in create_user: Label cardinality mismatch WARNING server:server.py:160 after_request instrumentation failed: Label cardinality mismatch ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret &gt; resp = client.post("/api/login", json=parameters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:111: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:284: in login observe_db_latency("login_select", time.time() - start_db) observability.py:317: in observe_db_latency DB_QUERY_LATENCY.observe(duration, op) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = HistogramMetric(name='tatou_db_query_duration_seconds', help='Duration of DB operations (best-effort manual instrument...n)', label_names=('operation',), buckets=(0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5), counts={}, sums={}) value = 0.12988042831420898, label_values = ('login_select',) def observe(self, value: float, *label_values: str) -&gt; None: if not len(label_values) != len(self.label_names): &gt; raise ValueError("Label cardinality mismatch") E ValueError: Label cardinality mismatch observability.py:66: ValueError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: Label cardinality mismatch _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } &gt; resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:147: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:401: in upload_document observe_db_latency("insert_document", time.time() - start_db) observability.py:317: in observe_db_latency DB_QUERY_LATENCY.observe(duration, op) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = HistogramMetric(name='tatou_db_query_duration_seconds', help='Duration of DB operations (best-effort manual instrument...n)', label_names=('operation',), buckets=(0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5), counts={}, sums={}) value = 0.07486772537231445, label_values = ('insert_document',) def observe(self, value: float, *label_values: str) -&gt; None: if not len(label_values) != len(self.label_names): &gt; raise ValueError("Label cardinality mismatch") E ValueError: Label cardinality mismatch observability.py:66: ValueError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: Label cardinality mismatch _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: Label cardinality mismatch ERROR server:server.py:1034 Watermarking failed for document 1 using method robust-xmp: Label cardinality mismatch WARNING server:server.py:160 after_request instrumentation failed: Label cardinality mismatch __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } &gt; upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:387: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:401: in upload_document observe_db_latency("insert_document", time.time() - start_db) observability.py:317: in observe_db_latency DB_QUERY_LATENCY.observe(duration, op) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = HistogramMetric(name='tatou_db_query_duration_seconds', help='Duration of DB operations (best-effort manual instrument...n)', label_names=('operation',), buckets=(0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5), counts={}, sums={}) value = 0.03587532043457031, label_values = ('insert_document',) def observe(self, value: float, *label_values: str) -&gt; None: if not len(label_values) != len(self.label_names): &gt; raise ValueError("Label cardinality mismatch") E ValueError: Label cardinality mismatch observability.py:66: ValueError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:147 Request size capture failed: Label cardinality mismatch ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - ValueError: Label cardinality ... FAILED ..\test\test_api.py::test_upload_document_route - ValueError: Label ca... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - ValueError: Label car... 5 failed, 9 passed, 22 warnings in 20.02s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1076"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1076_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1076_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1076_1"><button class="btn btn-outline-danger"><span class="job_id">1076 : Job ID 69235d7e2c484cca84bdb5afd18babd8</span></button></div></a><div aria-labelledby="job_list___sub_heading_1076_1" data-parent="#job_list___sub_accordion_1076" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1076_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=71" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (71, 15), end pos: (71, 25)</button></a></pre><pre>operator: core/AddNot, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -68,7 +68,7 @@ # Increment every bucket whose upper bound is &gt;= value so that # stored counts are already cumulative (Prometheus expectation). for b in self.buckets: - if value &lt;= b: + if not value &lt;= b: self.counts[(labels, b)] = self.counts.get((labels, b), 0) + 1 # Always increment +Inf bucket count inf_key = (labels, float("inf"))</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.11s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1077"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1077_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1077_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1077_1"><button class="btn btn-outline-danger"><span class="job_id">1077 : Job ID 797a9784df114b45b66f507e9ecd043a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1077_1" data-parent="#job_list___sub_accordion_1077" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1077_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=253" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (253, 11), end pos: (253, 35)</button></a></pre><pre>operator: core/AddNot, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -250,7 +250,7 @@ REQUEST_LATENCY.observe(duration, method, route) # decrement in-flight if previously incremented key = (route,) - if INFLIGHT.values.get(key): + if not INFLIGHT.values.get(key): INFLIGHT.values[key] -= 1 </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.74s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1078"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1078_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1078_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1078_1"><button class="btn btn-outline-success"><span class="job_id">1078 : Job ID 4c640d8f278f4898a50eac55696d5925</span></button></div></a><div aria-labelledby="job_list___sub_heading_1078_1" data-parent="#job_list___sub_accordion_1078" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1078_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=263" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (263, 7), end pos: (263, 31)</button></a></pre><pre>operator: core/AddNot, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -260,7 +260,7 @@ def observe_request_size(method: str, route: str, size: int | None) -&gt; None: - if size is None or size &lt; 0: + if not size is None or size &lt; 0: return with _lock: REQUEST_BODY_SIZE.observe(float(size), method, route)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T010434406764Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T010435383684Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.35s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1079"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1079_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1079_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1079_1"><button class="btn btn-outline-danger"><span class="job_id">1079 : Job ID db51ac25c0b24659b2dcda910cc18f2a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1079_1" data-parent="#job_list___sub_accordion_1079" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1079_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=28" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (28, 17), end pos: (28, 21)</button></a></pre><pre>operator: core/ReplaceTrueWithFalse, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -25,7 +25,7 @@ from time import time -@dataclass(slots=True) +@dataclass(slots=False) class CounterMetric: name: str help: str</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.63s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1080"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1080_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1080_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1080_1"><button class="btn btn-outline-success"><span class="job_id">1080 : Job ID 2d02a36c226141f48430902d537bb1f9</span></button></div></a><div aria-labelledby="job_list___sub_heading_1080_1" data-parent="#job_list___sub_accordion_1080" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1080_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=47" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (47, 65), end pos: (47, 69)</button></a></pre><pre>operator: core/ReplaceTrueWithFalse, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -44,7 +44,7 @@ for labels, value in sorted(self.values.items()): label_frag = ",".join( f"{k}={_quote(v)}" - for k, v in zip(self.label_names, labels, strict=True) + for k, v in zip(self.label_names, labels, strict=False) ) lines.append(f"{self.name}{{{label_frag}}} {value}") return "\n".join(lines)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T190116605795Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T190117491419Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.92s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1081"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1081_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1081_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1081_1"><button class="btn btn-outline-danger"><span class="job_id">1081 : Job ID fc6a2d53f53547f0bf6f6198a36bd8e7</span></button></div></a><div aria-labelledby="job_list___sub_heading_1081_1" data-parent="#job_list___sub_accordion_1081" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1081_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=53" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (53, 17), end pos: (53, 21)</button></a></pre><pre>operator: core/ReplaceTrueWithFalse, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -50,7 +50,7 @@ return "\n".join(lines) -@dataclass(slots=True) +@dataclass(slots=False) class HistogramMetric: name: str help: str</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.12s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1082"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1082_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1082_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1082_1"><button class="btn btn-outline-success"><span class="job_id">1082 : Job ID d4c61841cf8741a6b7afebdb52f5d055</span></button></div></a><div aria-labelledby="job_list___sub_heading_1082_1" data-parent="#job_list___sub_accordion_1082" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1082_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=89" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (89, 65), end pos: (89, 69)</button></a></pre><pre>operator: core/ReplaceTrueWithFalse, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -86,7 +86,7 @@ for labels in label_sets: label_frag = ",".join( f"{k}={_quote(v)}" - for k, v in zip(self.label_names, labels, strict=True) + for k, v in zip(self.label_names, labels, strict=False) ) # Emit stored cumulative counts for each finite bucket for b in self.buckets:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T052446236908Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T052447102690Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.80s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1083"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1083_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1083_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1083_1"><button class="btn btn-outline-danger"><span class="job_id">1083 : Job ID fc80741f4a2044168e1134e0664ad05f</span></button></div></a><div aria-labelledby="job_list___sub_heading_1083_1" data-parent="#job_list___sub_accordion_1083" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1083_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=333" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (333, 15), end pos: (333, 20)</button></a></pre><pre>operator: core/ReplaceFalseWithTrue, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -330,5 +330,5 @@ def __exit__(self): self.elapsed = time() - self._start - return False - + return True +</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.36s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1084"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1084_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1084_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1084_1"><button class="btn btn-outline-success"><span class="job_id">1084 : Job ID 019c69c8737041ceb5b15a74763e4bdc</span></button></div></a><div aria-labelledby="job_list___sub_heading_1084_1" data-parent="#job_list___sub_accordion_1084" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1084_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=263" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (263, 20), end pos: (263, 22)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -260,7 +260,7 @@ def observe_request_size(method: str, route: str, size: int | None) -&gt; None: - if size is None or size &lt; 0: + if size is None and size &lt; 0: return with _lock: REQUEST_BODY_SIZE.observe(float(size), method, route)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T152945329940Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T152946169234Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.14s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1085"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1085_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1085_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1085_1"><button class="btn btn-outline-danger"><span class="job_id">1085 : Job ID a4a1935bd8e04cf8a0653d2963a259f6</span></button></div></a><div aria-labelledby="job_list___sub_heading_1085_1" data-parent="#job_list___sub_accordion_1085" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1085_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=36" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (36, 54), end pos: (36, 57)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -33,7 +33,7 @@ values: dict[tuple[str, ...], float] label_names: tuple[str, ...] - def inc(self, *label_values: str, amount: float = 1.0) -&gt; None: + def inc(self, *label_values: str, amount: float = 2.0) -&gt; None: if len(label_values) != len(self.label_names): # defensive raise ValueError("Label cardinality mismatch") key = tuple(label_values)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.30s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1086"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1086_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1086_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1086_1"><button class="btn btn-outline-danger"><span class="job_id">1086 : Job ID 053e3c466acc4d10a2c39fd99cb2fb42</span></button></div></a><div aria-labelledby="job_list___sub_heading_1086_1" data-parent="#job_list___sub_accordion_1086" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1086_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=36" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (36, 54), end pos: (36, 57)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -33,7 +33,7 @@ values: dict[tuple[str, ...], float] label_names: tuple[str, ...] - def inc(self, *label_values: str, amount: float = 1.0) -&gt; None: + def inc(self, *label_values: str, amount: float = 0.0) -&gt; None: if len(label_values) != len(self.label_names): # defensive raise ValueError("Label cardinality mismatch") key = tuple(label_values)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.52s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1087"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1087_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1087_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1087_1"><button class="btn btn-outline-danger"><span class="job_id">1087 : Job ID 1c8527aed632455c97af69361f82cca5</span></button></div></a><div aria-labelledby="job_list___sub_heading_1087_1" data-parent="#job_list___sub_accordion_1087" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1087_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=40" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (40, 48), end pos: (40, 51)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -37,7 +37,7 @@ if len(label_values) != len(self.label_names): # defensive raise ValueError("Label cardinality mismatch") key = tuple(label_values) - self.values[key] = self.values.get(key, 0.0) + amount + self.values[key] = self.values.get(key, 1.0) + amount def render(self) -&gt; str: lines = [f"# HELP {self.name} {self.help}", f"# TYPE {self.name} counter"]</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.22s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1088"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1088_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1088_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1088_1"><button class="btn btn-outline-success"><span class="job_id">1088 : Job ID 173e0004e4c642f394a1c663f8703793</span></button></div></a><div aria-labelledby="job_list___sub_heading_1088_1" data-parent="#job_list___sub_accordion_1088" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1088_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=40" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (40, 48), end pos: (40, 51)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -37,7 +37,7 @@ if len(label_values) != len(self.label_names): # defensive raise ValueError("Label cardinality mismatch") key = tuple(label_values) - self.values[key] = self.values.get(key, 0.0) + amount + self.values[key] = self.values.get(key, -1.0) + amount def render(self) -&gt; str: lines = [f"# HELP {self.name} {self.help}", f"# TYPE {self.name} counter"]</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T183031515422Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T183032406727Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 20.09s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1089"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1089_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1089_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1089_1"><button class="btn btn-outline-danger"><span class="job_id">1089 : Job ID a0d54ff22c954472899a4e7b72547935</span></button></div></a><div aria-labelledby="job_list___sub_heading_1089_1" data-parent="#job_list___sub_accordion_1089" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1089_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=72" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (72, 72), end pos: (72, 73)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -69,7 +69,7 @@ # stored counts are already cumulative (Prometheus expectation). for b in self.buckets: if value &lt;= b: - self.counts[(labels, b)] = self.counts.get((labels, b), 0) + 1 + self.counts[(labels, b)] = self.counts.get((labels, b), 1) + 1 # Always increment +Inf bucket count inf_key = (labels, float("inf")) self.counts[inf_key] = self.counts.get(inf_key, 0) + 1</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.43s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1090"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1090_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1090_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1090_1"><button class="btn btn-outline-success"><span class="job_id">1090 : Job ID d0a26def8f704b918eff575e8cdd4e61</span></button></div></a><div aria-labelledby="job_list___sub_heading_1090_1" data-parent="#job_list___sub_accordion_1090" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1090_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=72" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (72, 72), end pos: (72, 73)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -69,7 +69,7 @@ # stored counts are already cumulative (Prometheus expectation). for b in self.buckets: if value &lt;= b: - self.counts[(labels, b)] = self.counts.get((labels, b), 0) + 1 + self.counts[(labels, b)] = self.counts.get((labels, b), -1) + 1 # Always increment +Inf bucket count inf_key = (labels, float("inf")) self.counts[inf_key] = self.counts.get(inf_key, 0) + 1</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T224039568893Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T224040484305Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.61s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1091"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1091_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1091_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1091_1"><button class="btn btn-outline-danger"><span class="job_id">1091 : Job ID e556ed21e05f44f49f85c955dd51502d</span></button></div></a><div aria-labelledby="job_list___sub_heading_1091_1" data-parent="#job_list___sub_accordion_1091" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1091_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=72" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (72, 77), end pos: (72, 78)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -69,7 +69,7 @@ # stored counts are already cumulative (Prometheus expectation). for b in self.buckets: if value &lt;= b: - self.counts[(labels, b)] = self.counts.get((labels, b), 0) + 1 + self.counts[(labels, b)] = self.counts.get((labels, b), 0) + 2 # Always increment +Inf bucket count inf_key = (labels, float("inf")) self.counts[inf_key] = self.counts.get(inf_key, 0) + 1</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.93s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1092"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1092_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1092_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1092_1"><button class="btn btn-outline-success"><span class="job_id">1092 : Job ID c8a5ff9cd2fe4cc3990834ef06fe6ef3</span></button></div></a><div aria-labelledby="job_list___sub_heading_1092_1" data-parent="#job_list___sub_accordion_1092" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1092_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=72" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (72, 77), end pos: (72, 78)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -69,7 +69,7 @@ # stored counts are already cumulative (Prometheus expectation). for b in self.buckets: if value &lt;= b: - self.counts[(labels, b)] = self.counts.get((labels, b), 0) + 1 + self.counts[(labels, b)] = self.counts.get((labels, b), 0) + 0 # Always increment +Inf bucket count inf_key = (labels, float("inf")) self.counts[inf_key] = self.counts.get(inf_key, 0) + 1</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T031737064477Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T031737902379Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.12s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1093"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1093_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1093_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1093_1"><button class="btn btn-outline-danger"><span class="job_id">1093 : Job ID 37dc9be6e3024773a0e55aae5c22f371</span></button></div></a><div aria-labelledby="job_list___sub_heading_1093_1" data-parent="#job_list___sub_accordion_1093" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1093_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=75" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (75, 56), end pos: (75, 57)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 8</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -72,7 +72,7 @@ self.counts[(labels, b)] = self.counts.get((labels, b), 0) + 1 # Always increment +Inf bucket count inf_key = (labels, float("inf")) - self.counts[inf_key] = self.counts.get(inf_key, 0) + 1 + self.counts[inf_key] = self.counts.get(inf_key, 1) + 1 self.sums[labels] = self.sums.get(labels, 0.0) + value def render(self) -&gt; str:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.44s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1094"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1094_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1094_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1094_1"><button class="btn btn-outline-danger"><span class="job_id">1094 : Job ID bf213eb55d024c57bbd0fc8ec94c7b6c</span></button></div></a><div aria-labelledby="job_list___sub_heading_1094_1" data-parent="#job_list___sub_accordion_1094" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1094_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=75" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (75, 56), end pos: (75, 57)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 9</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -72,7 +72,7 @@ self.counts[(labels, b)] = self.counts.get((labels, b), 0) + 1 # Always increment +Inf bucket count inf_key = (labels, float("inf")) - self.counts[inf_key] = self.counts.get(inf_key, 0) + 1 + self.counts[inf_key] = self.counts.get(inf_key, -1) + 1 self.sums[labels] = self.sums.get(labels, 0.0) + value def render(self) -&gt; str:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.33s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1095"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1095_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1095_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1095_1"><button class="btn btn-outline-success"><span class="job_id">1095 : Job ID 20ac4b4240ba4df2a2acf9286b585c45</span></button></div></a><div aria-labelledby="job_list___sub_heading_1095_1" data-parent="#job_list___sub_accordion_1095" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1095_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=75" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (75, 61), end pos: (75, 62)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 10</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -72,7 +72,7 @@ self.counts[(labels, b)] = self.counts.get((labels, b), 0) + 1 # Always increment +Inf bucket count inf_key = (labels, float("inf")) - self.counts[inf_key] = self.counts.get(inf_key, 0) + 1 + self.counts[inf_key] = self.counts.get(inf_key, 0) + 2 self.sums[labels] = self.sums.get(labels, 0.0) + value def render(self) -&gt; str:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T044929317924Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T044930201171Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.38s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1096"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1096_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1096_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1096_1"><button class="btn btn-outline-danger"><span class="job_id">1096 : Job ID 211fd44893764cf99f66a6a454ead7d4</span></button></div></a><div aria-labelledby="job_list___sub_heading_1096_1" data-parent="#job_list___sub_accordion_1096" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1096_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=75" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (75, 61), end pos: (75, 62)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 11</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -72,7 +72,7 @@ self.counts[(labels, b)] = self.counts.get((labels, b), 0) + 1 # Always increment +Inf bucket count inf_key = (labels, float("inf")) - self.counts[inf_key] = self.counts.get(inf_key, 0) + 1 + self.counts[inf_key] = self.counts.get(inf_key, 0) + 0 self.sums[labels] = self.sums.get(labels, 0.0) + value def render(self) -&gt; str:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.20s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1097"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1097_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1097_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1097_1"><button class="btn btn-outline-danger"><span class="job_id">1097 : Job ID 7ae98566bdd741e3968ab8151f20d1ee</span></button></div></a><div aria-labelledby="job_list___sub_heading_1097_1" data-parent="#job_list___sub_accordion_1097" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1097_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=76" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (76, 50), end pos: (76, 53)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 12</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -73,7 +73,7 @@ # Always increment +Inf bucket count inf_key = (labels, float("inf")) self.counts[inf_key] = self.counts.get(inf_key, 0) + 1 - self.sums[labels] = self.sums.get(labels, 0.0) + value + self.sums[labels] = self.sums.get(labels, 1.0) + value def render(self) -&gt; str: # Prometheus histogram:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.69s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1098"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1098_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1098_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1098_1"><button class="btn btn-outline-success"><span class="job_id">1098 : Job ID 5ffd5401d36744d39b8f42905178cb25</span></button></div></a><div aria-labelledby="job_list___sub_heading_1098_1" data-parent="#job_list___sub_accordion_1098" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1098_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=76" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (76, 50), end pos: (76, 53)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 13</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -73,7 +73,7 @@ # Always increment +Inf bucket count inf_key = (labels, float("inf")) self.counts[inf_key] = self.counts.get(inf_key, 0) + 1 - self.sums[labels] = self.sums.get(labels, 0.0) + value + self.sums[labels] = self.sums.get(labels, -1.0) + value def render(self) -&gt; str: # Prometheus histogram:</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614efa6ec95cb6bcc5a4: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.69s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1099"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1099_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1099_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1099_1"><button class="btn btn-outline-danger"><span class="job_id">1099 : Job ID 5e974c6e016045bea4f4e61b4479a165</span></button></div></a><div aria-labelledby="job_list___sub_heading_1099_1" data-parent="#job_list___sub_accordion_1099" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1099_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=93" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (93, 49), end pos: (93, 50)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 14</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -90,7 +90,7 @@ ) # Emit stored cumulative counts for each finite bucket for b in self.buckets: - c = self.counts.get((labels, b), 0) + c = self.counts.get((labels, b), 1) lines.append( f"{self.name}_bucket{{{label_frag},le={_quote(repr(b))}}} {c}" )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.21s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1100"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1100_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1100_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1100_1"><button class="btn btn-outline-success"><span class="job_id">1100 : Job ID e06672e9201d41359ea9c56d2588951f</span></button></div></a><div aria-labelledby="job_list___sub_heading_1100_1" data-parent="#job_list___sub_accordion_1100" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1100_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=93" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (93, 49), end pos: (93, 50)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 15</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -90,7 +90,7 @@ ) # Emit stored cumulative counts for each finite bucket for b in self.buckets: - c = self.counts.get((labels, b), 0) + c = self.counts.get((labels, b), -1) lines.append( f"{self.name}_bucket{{{label_frag},le={_quote(repr(b))}}} {c}" )</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T044020319607Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T044021252025Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.57s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1101"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1101_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1101_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1101_1"><button class="btn btn-outline-danger"><span class="job_id">1101 : Job ID 161f24cb1d7043dca6f6b14ca373ec06</span></button></div></a><div aria-labelledby="job_list___sub_heading_1101_1" data-parent="#job_list___sub_accordion_1101" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1101_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=98" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (98, 60), end pos: (98, 61)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 16</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -95,7 +95,7 @@ f"{self.name}_bucket{{{label_frag},le={_quote(repr(b))}}} {c}" ) # +Inf bucket / total - total = self.counts.get((labels, float("inf")), 0) + total = self.counts.get((labels, float("inf")), 1) lines.append( f"{self.name}_bucket{{{label_frag},le={_quote('+Inf')}}} {total}" )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.56s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1102"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1102_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1102_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1102_1"><button class="btn btn-outline-danger"><span class="job_id">1102 : Job ID 79dca54b64664a21bad0a432e0810293</span></button></div></a><div aria-labelledby="job_list___sub_heading_1102_1" data-parent="#job_list___sub_accordion_1102" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1102_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=98" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (98, 60), end pos: (98, 61)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 17</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -95,7 +95,7 @@ f"{self.name}_bucket{{{label_frag},le={_quote(repr(b))}}} {c}" ) # +Inf bucket / total - total = self.counts.get((labels, float("inf")), 0) + total = self.counts.get((labels, float("inf")), -1) lines.append( f"{self.name}_bucket{{{label_frag},le={_quote('+Inf')}}} {total}" )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.89s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1103"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1103_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1103_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1103_1"><button class="btn btn-outline-success"><span class="job_id">1103 : Job ID ff0b4017b00948199f7ca84e8769e6b0</span></button></div></a><div aria-labelledby="job_list___sub_heading_1103_1" data-parent="#job_list___sub_accordion_1103" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1103_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=103" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (103, 73), end pos: (103, 76)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 18</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -100,7 +100,7 @@ f"{self.name}_bucket{{{label_frag},le={_quote('+Inf')}}} {total}" ) lines.append( - f"{self.name}_sum{{{label_frag}}} {self.sums.get(labels, 0.0)}" + f"{self.name}_sum{{{label_frag}}} {self.sums.get(labels, 1.0)}" ) lines.append(f"{self.name}_count{{{label_frag}}} {total}") return "\n".join(lines)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T002652814057Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T002653747727Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.21s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1104"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1104_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1104_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1104_1"><button class="btn btn-outline-success"><span class="job_id">1104 : Job ID 5578f74c672b4033be47f3d7dd9d3514</span></button></div></a><div aria-labelledby="job_list___sub_heading_1104_1" data-parent="#job_list___sub_accordion_1104" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1104_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=103" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (103, 73), end pos: (103, 76)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 19</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -100,7 +100,7 @@ f"{self.name}_bucket{{{label_frag},le={_quote('+Inf')}}} {total}" ) lines.append( - f"{self.name}_sum{{{label_frag}}} {self.sums.get(labels, 0.0)}" + f"{self.name}_sum{{{label_frag}}} {self.sums.get(labels, -1.0)}" ) lines.append(f"{self.name}_count{{{label_frag}}} {total}") return "\n".join(lines)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T143323956805Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T143324868218Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.23s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1105"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1105_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1105_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1105_1"><button class="btn btn-outline-danger"><span class="job_id">1105 : Job ID 29d09305b61c469a83f8555391053409</span></button></div></a><div aria-labelledby="job_list___sub_heading_1105_1" data-parent="#job_list___sub_accordion_1105" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1105_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=126" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (126, 13), end pos: (126, 18)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 20</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -123,7 +123,7 @@ name="tatou_http_request_duration_seconds", help="Latency in seconds of HTTP requests", label_names=("method", "route"), - buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0), + buckets=( 1.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.13s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1106"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1106_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1106_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1106_1"><button class="btn btn-outline-danger"><span class="job_id">1106 : Job ID a81e020623614124ac81a2bbab7df998</span></button></div></a><div aria-labelledby="job_list___sub_heading_1106_1" data-parent="#job_list___sub_accordion_1106" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1106_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=126" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (126, 13), end pos: (126, 18)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 21</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -123,7 +123,7 @@ name="tatou_http_request_duration_seconds", help="Latency in seconds of HTTP requests", label_names=("method", "route"), - buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0), + buckets=( -0.995, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.03s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1107"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1107_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1107_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1107_1"><button class="btn btn-outline-danger"><span class="job_id">1107 : Job ID 200264df5b4b4a649c2694cdf63605ca</span></button></div></a><div aria-labelledby="job_list___sub_heading_1107_1" data-parent="#job_list___sub_accordion_1107" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1107_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=126" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (126, 20), end pos: (126, 24)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 22</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -123,7 +123,7 @@ name="tatou_http_request_duration_seconds", help="Latency in seconds of HTTP requests", label_names=("method", "route"), - buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0), + buckets=(0.005, 1.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.28s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1108"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1108_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1108_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1108_1"><button class="btn btn-outline-danger"><span class="job_id">1108 : Job ID 6be0c05f45ca4ec78b93fe396abbded9</span></button></div></a><div aria-labelledby="job_list___sub_heading_1108_1" data-parent="#job_list___sub_accordion_1108" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1108_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=126" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (126, 20), end pos: (126, 24)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 23</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -123,7 +123,7 @@ name="tatou_http_request_duration_seconds", help="Latency in seconds of HTTP requests", label_names=("method", "route"), - buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0), + buckets=(0.005, -0.99, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.27s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1109"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1109_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1109_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1109_1"><button class="btn btn-outline-danger"><span class="job_id">1109 : Job ID 50b1f343dcf3416c87be3fe9f4a5078d</span></button></div></a><div aria-labelledby="job_list___sub_heading_1109_1" data-parent="#job_list___sub_accordion_1109" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1109_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=126" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (126, 26), end pos: (126, 31)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 24</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -123,7 +123,7 @@ name="tatou_http_request_duration_seconds", help="Latency in seconds of HTTP requests", label_names=("method", "route"), - buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0), + buckets=(0.005, 0.01, 1.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.42s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1110"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1110_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1110_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1110_1"><button class="btn btn-outline-success"><span class="job_id">1110 : Job ID 1c93099c94b547929d3de9f99c88ec3b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1110_1" data-parent="#job_list___sub_accordion_1110" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1110_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=126" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (126, 26), end pos: (126, 31)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 25</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -123,7 +123,7 @@ name="tatou_http_request_duration_seconds", help="Latency in seconds of HTTP requests", label_names=("method", "route"), - buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0), + buckets=(0.005, 0.01, -0.975, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%]</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1111"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1111_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1111_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1111_1"><button class="btn btn-outline-danger"><span class="job_id">1111 : Job ID a6da606b4be54361b722caef8d86429c</span></button></div></a><div aria-labelledby="job_list___sub_heading_1111_1" data-parent="#job_list___sub_accordion_1111" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1111_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=126" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (126, 33), end pos: (126, 37)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 26</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -123,7 +123,7 @@ name="tatou_http_request_duration_seconds", help="Latency in seconds of HTTP requests", label_names=("method", "route"), - buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0), + buckets=(0.005, 0.01, 0.025, 1.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.13s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1112"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1112_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1112_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1112_1"><button class="btn btn-outline-danger"><span class="job_id">1112 : Job ID 40794286691f4c018c9edf1d62228d8b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1112_1" data-parent="#job_list___sub_accordion_1112" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1112_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=126" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (126, 33), end pos: (126, 37)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 27</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -123,7 +123,7 @@ name="tatou_http_request_duration_seconds", help="Latency in seconds of HTTP requests", label_names=("method", "route"), - buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0), + buckets=(0.005, 0.01, 0.025, -0.95, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.12s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1113"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1113_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1113_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1113_1"><button class="btn btn-outline-danger"><span class="job_id">1113 : Job ID 33d87fcbfede4bf8aac67b079d4c6fb2</span></button></div></a><div aria-labelledby="job_list___sub_heading_1113_1" data-parent="#job_list___sub_accordion_1113" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1113_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=126" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (126, 39), end pos: (126, 42)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 28</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -123,7 +123,7 @@ name="tatou_http_request_duration_seconds", help="Latency in seconds of HTTP requests", label_names=("method", "route"), - buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0), + buckets=(0.005, 0.01, 0.025, 0.05, 1.1, 0.25, 0.5, 1.0, 2.5, 5.0), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.40s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1114"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1114_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1114_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1114_1"><button class="btn btn-outline-danger"><span class="job_id">1114 : Job ID e0500fad32f84a9b84fa5f3575e7c6ca</span></button></div></a><div aria-labelledby="job_list___sub_heading_1114_1" data-parent="#job_list___sub_accordion_1114" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1114_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=126" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (126, 39), end pos: (126, 42)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 29</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -123,7 +123,7 @@ name="tatou_http_request_duration_seconds", help="Latency in seconds of HTTP requests", label_names=("method", "route"), - buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0), + buckets=(0.005, 0.01, 0.025, 0.05, -0.9, 0.25, 0.5, 1.0, 2.5, 5.0), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.31s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1115"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1115_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1115_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1115_1"><button class="btn btn-outline-danger"><span class="job_id">1115 : Job ID ca2e5e84122d4846bfb214cdff9f3487</span></button></div></a><div aria-labelledby="job_list___sub_heading_1115_1" data-parent="#job_list___sub_accordion_1115" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1115_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=126" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (126, 44), end pos: (126, 48)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 30</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -123,7 +123,7 @@ name="tatou_http_request_duration_seconds", help="Latency in seconds of HTTP requests", label_names=("method", "route"), - buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0), + buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 1.25, 0.5, 1.0, 2.5, 5.0), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.05s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1116"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1116_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1116_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1116_1"><button class="btn btn-outline-danger"><span class="job_id">1116 : Job ID f30b69f1e76646ff9c5454e342986890</span></button></div></a><div aria-labelledby="job_list___sub_heading_1116_1" data-parent="#job_list___sub_accordion_1116" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1116_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=126" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (126, 44), end pos: (126, 48)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 31</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -123,7 +123,7 @@ name="tatou_http_request_duration_seconds", help="Latency in seconds of HTTP requests", label_names=("method", "route"), - buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0), + buckets=(0.005, 0.01, 0.025, 0.05, 0.1, -0.75, 0.5, 1.0, 2.5, 5.0), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.95s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1117"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1117_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1117_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1117_1"><button class="btn btn-outline-success"><span class="job_id">1117 : Job ID caedcceda6014666bf64a9715033bf92</span></button></div></a><div aria-labelledby="job_list___sub_heading_1117_1" data-parent="#job_list___sub_accordion_1117" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1117_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=126" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (126, 50), end pos: (126, 53)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 32</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -123,7 +123,7 @@ name="tatou_http_request_duration_seconds", help="Latency in seconds of HTTP requests", label_names=("method", "route"), - buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0), + buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 1.5, 1.0, 2.5, 5.0), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e5a83419b09741a36: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.71s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1118"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1118_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1118_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1118_1"><button class="btn btn-outline-danger"><span class="job_id">1118 : Job ID 63de0086280e4eb1baca5048cc4de801</span></button></div></a><div aria-labelledby="job_list___sub_heading_1118_1" data-parent="#job_list___sub_accordion_1118" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1118_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=126" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (126, 50), end pos: (126, 53)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 33</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -123,7 +123,7 @@ name="tatou_http_request_duration_seconds", help="Latency in seconds of HTTP requests", label_names=("method", "route"), - buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0), + buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, -0.5, 1.0, 2.5, 5.0), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.25s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1119"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1119_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1119_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1119_1"><button class="btn btn-outline-success"><span class="job_id">1119 : Job ID a9c88b4230b648a2b3a6d974bb484819</span></button></div></a><div aria-labelledby="job_list___sub_heading_1119_1" data-parent="#job_list___sub_accordion_1119" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1119_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=126" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (126, 55), end pos: (126, 58)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 34</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -123,7 +123,7 @@ name="tatou_http_request_duration_seconds", help="Latency in seconds of HTTP requests", label_names=("method", "route"), - buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0), + buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 2.0, 2.5, 5.0), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">...F.......... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:228: in open request = self._request_from_builder_args(args, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:200: in _request_from_builder_args return builder.get_request() ^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:764: in get_request return cls(self.get_environ()) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:688: in get_environ input_stream, content_length, boundary = stream_encode_multipart( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:130: in stream_encode_multipart write_binary(encoder.send_event(Data(data=chunk, more_data=True))) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:81: in write_binary return stream.write(s) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... 1 failed, 13 passed, 22 warnings in 21.40s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1120"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1120_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1120_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1120_1"><button class="btn btn-outline-danger"><span class="job_id">1120 : Job ID dbc9d137476a46519ecb101f5d10f6b1</span></button></div></a><div aria-labelledby="job_list___sub_heading_1120_1" data-parent="#job_list___sub_accordion_1120" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1120_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=126" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (126, 55), end pos: (126, 58)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 35</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -123,7 +123,7 @@ name="tatou_http_request_duration_seconds", help="Latency in seconds of HTTP requests", label_names=("method", "route"), - buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0), + buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 0.0, 2.5, 5.0), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.44s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1121"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1121_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1121_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1121_1"><button class="btn btn-outline-danger"><span class="job_id">1121 : Job ID 13f06a19dc104a3c8be97e9d112f32e0</span></button></div></a><div aria-labelledby="job_list___sub_heading_1121_1" data-parent="#job_list___sub_accordion_1121" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1121_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=126" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (126, 60), end pos: (126, 63)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 36</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -123,7 +123,7 @@ name="tatou_http_request_duration_seconds", help="Latency in seconds of HTTP requests", label_names=("method", "route"), - buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0), + buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 3.5, 5.0), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.04s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1122"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1122_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1122_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1122_1"><button class="btn btn-outline-danger"><span class="job_id">1122 : Job ID 3909825165e64e9aa884c83848ac2a85</span></button></div></a><div aria-labelledby="job_list___sub_heading_1122_1" data-parent="#job_list___sub_accordion_1122" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1122_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=126" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (126, 60), end pos: (126, 63)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 37</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -123,7 +123,7 @@ name="tatou_http_request_duration_seconds", help="Latency in seconds of HTTP requests", label_names=("method", "route"), - buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0), + buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 1.5, 5.0), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.10s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1123"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1123_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1123_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1123_1"><button class="btn btn-outline-success"><span class="job_id">1123 : Job ID 40a79baf043445a9adce5d4d1df1f89f</span></button></div></a><div aria-labelledby="job_list___sub_heading_1123_1" data-parent="#job_list___sub_accordion_1123" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1123_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=126" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (126, 65), end pos: (126, 68)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 38</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -123,7 +123,7 @@ name="tatou_http_request_duration_seconds", help="Latency in seconds of HTTP requests", label_names=("method", "route"), - buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0), + buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 6.0), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T233854033410Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T233854921495Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.32s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1124"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1124_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1124_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1124_1"><button class="btn btn-outline-danger"><span class="job_id">1124 : Job ID 953df731f2fc46b196dc14eb89da451a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1124_1" data-parent="#job_list___sub_accordion_1124" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1124_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=126" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (126, 65), end pos: (126, 68)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 39</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -123,7 +123,7 @@ name="tatou_http_request_duration_seconds", help="Latency in seconds of HTTP requests", label_names=("method", "route"), - buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0), + buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 4.0), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.37s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1125"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1125_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1125_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1125_1"><button class="btn btn-outline-success"><span class="job_id">1125 : Job ID 94632d97cb6d48a3b3e989da48491e84</span></button></div></a><div aria-labelledby="job_list___sub_heading_1125_1" data-parent="#job_list___sub_accordion_1125" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1125_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=194" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (194, 13), end pos: (194, 18)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 40</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -191,7 +191,7 @@ name="tatou_db_query_duration_seconds", help="Duration of DB operations (best-effort manual instrumentation)", label_names=("operation",), - buckets=(0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5), + buckets=( 1.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T160130650020Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T160131500317Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.35s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1126"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1126_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1126_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1126_1"><button class="btn btn-outline-success"><span class="job_id">1126 : Job ID 61a64696327d46f5a17fc77c4423d2ee</span></button></div></a><div aria-labelledby="job_list___sub_heading_1126_1" data-parent="#job_list___sub_accordion_1126" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1126_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=194" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (194, 13), end pos: (194, 18)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 41</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -191,7 +191,7 @@ name="tatou_db_query_duration_seconds", help="Duration of DB operations (best-effort manual instrumentation)", label_names=("operation",), - buckets=(0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5), + buckets=( -0.999, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T011931282143Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T011932185191Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.27s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1127"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1127_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1127_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1127_1"><button class="btn btn-outline-danger"><span class="job_id">1127 : Job ID cc5de4ddd377486a993ba7566edcbcc9</span></button></div></a><div aria-labelledby="job_list___sub_heading_1127_1" data-parent="#job_list___sub_accordion_1127" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1127_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=194" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (194, 20), end pos: (194, 25)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 42</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -191,7 +191,7 @@ name="tatou_db_query_duration_seconds", help="Duration of DB operations (best-effort manual instrumentation)", label_names=("operation",), - buckets=(0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5), + buckets=(0.001, 1.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.10s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1128"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1128_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1128_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1128_1"><button class="btn btn-outline-success"><span class="job_id">1128 : Job ID f3023194b09f4ce5aaf17cf63348b941</span></button></div></a><div aria-labelledby="job_list___sub_heading_1128_1" data-parent="#job_list___sub_accordion_1128" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1128_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=194" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (194, 20), end pos: (194, 25)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 43</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -191,7 +191,7 @@ name="tatou_db_query_duration_seconds", help="Duration of DB operations (best-effort manual instrumentation)", label_names=("operation",), - buckets=(0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5), + buckets=(0.001, -0.995, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 4 failed, 10 passed, 22 warnings in 19.70s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1129"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1129_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1129_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1129_1"><button class="btn btn-outline-success"><span class="job_id">1129 : Job ID 2e3461c925bf4778a9f1fec077f4484b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1129_1" data-parent="#job_list___sub_accordion_1129" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1129_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=194" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (194, 27), end pos: (194, 31)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 44</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -191,7 +191,7 @@ name="tatou_db_query_duration_seconds", help="Duration of DB operations (best-effort manual instrumentation)", label_names=("operation",), - buckets=(0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5), + buckets=(0.001, 0.005, 1.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T193449052231Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T193449992413Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.80s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1130"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1130_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1130_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1130_1"><button class="btn btn-outline-success"><span class="job_id">1130 : Job ID a62b0230423f4fd39e991645ec83001b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1130_1" data-parent="#job_list___sub_accordion_1130" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1130_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=194" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (194, 27), end pos: (194, 31)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 45</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -191,7 +191,7 @@ name="tatou_db_query_duration_seconds", help="Duration of DB operations (best-effort manual instrumentation)", label_names=("operation",), - buckets=(0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5), + buckets=(0.001, 0.005, -0.99, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e5d1c4167ccd6ecd9: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 21.44s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1131"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1131_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1131_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1131_1"><button class="btn btn-outline-success"><span class="job_id">1131 : Job ID a238c694acb4429589ea883a3d548ba6</span></button></div></a><div aria-labelledby="job_list___sub_heading_1131_1" data-parent="#job_list___sub_accordion_1131" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1131_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=194" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (194, 33), end pos: (194, 38)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 46</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -191,7 +191,7 @@ name="tatou_db_query_duration_seconds", help="Duration of DB operations (best-effort manual instrumentation)", label_names=("operation",), - buckets=(0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5), + buckets=(0.001, 0.005, 0.01, 1.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e8db0232e3b4e8ccf: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 20.00s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1132"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1132_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1132_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1132_1"><button class="btn btn-outline-danger"><span class="job_id">1132 : Job ID 31ac7c404b4943ebb69ac7edf721e75c</span></button></div></a><div aria-labelledby="job_list___sub_heading_1132_1" data-parent="#job_list___sub_accordion_1132" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1132_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=194" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (194, 33), end pos: (194, 38)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 47</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -191,7 +191,7 @@ name="tatou_db_query_duration_seconds", help="Duration of DB operations (best-effort manual instrumentation)", label_names=("operation",), - buckets=(0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5), + buckets=(0.001, 0.005, 0.01, -0.975, 0.05, 0.1, 0.25, 0.5, 1, 2.5), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.60s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1133"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1133_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1133_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1133_1"><button class="btn btn-outline-danger"><span class="job_id">1133 : Job ID 81099dc34e0f4bf180419b3e4347b73c</span></button></div></a><div aria-labelledby="job_list___sub_heading_1133_1" data-parent="#job_list___sub_accordion_1133" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1133_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=194" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (194, 40), end pos: (194, 44)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 48</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -191,7 +191,7 @@ name="tatou_db_query_duration_seconds", help="Duration of DB operations (best-effort manual instrumentation)", label_names=("operation",), - buckets=(0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5), + buckets=(0.001, 0.005, 0.01, 0.025, 1.05, 0.1, 0.25, 0.5, 1, 2.5), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.51s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1134"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1134_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1134_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1134_1"><button class="btn btn-outline-success"><span class="job_id">1134 : Job ID e66f0823542047ac87f90f0584aadf41</span></button></div></a><div aria-labelledby="job_list___sub_heading_1134_1" data-parent="#job_list___sub_accordion_1134" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1134_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=194" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (194, 40), end pos: (194, 44)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 49</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -191,7 +191,7 @@ name="tatou_db_query_duration_seconds", help="Duration of DB operations (best-effort manual instrumentation)", label_names=("operation",), - buckets=(0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5), + buckets=(0.001, 0.005, 0.01, 0.025, -0.95, 0.1, 0.25, 0.5, 1, 2.5), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T011152725868Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T011153625895Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.50s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1135"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1135_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1135_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1135_1"><button class="btn btn-outline-danger"><span class="job_id">1135 : Job ID 8f0bb5c4a3b94d8d96194390d8348ef1</span></button></div></a><div aria-labelledby="job_list___sub_heading_1135_1" data-parent="#job_list___sub_accordion_1135" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1135_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=194" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (194, 46), end pos: (194, 49)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 50</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -191,7 +191,7 @@ name="tatou_db_query_duration_seconds", help="Duration of DB operations (best-effort manual instrumentation)", label_names=("operation",), - buckets=(0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5), + buckets=(0.001, 0.005, 0.01, 0.025, 0.05, 1.1, 0.25, 0.5, 1, 2.5), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.10s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1136"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1136_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1136_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1136_1"><button class="btn btn-outline-danger"><span class="job_id">1136 : Job ID 783e087830794a96bf35db3c1e1d4f07</span></button></div></a><div aria-labelledby="job_list___sub_heading_1136_1" data-parent="#job_list___sub_accordion_1136" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1136_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=194" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (194, 46), end pos: (194, 49)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 51</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -191,7 +191,7 @@ name="tatou_db_query_duration_seconds", help="Duration of DB operations (best-effort manual instrumentation)", label_names=("operation",), - buckets=(0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5), + buckets=(0.001, 0.005, 0.01, 0.025, 0.05, -0.9, 0.25, 0.5, 1, 2.5), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.13s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1137"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1137_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1137_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1137_1"><button class="btn btn-outline-success"><span class="job_id">1137 : Job ID f88cadb3c34c4774a00332bde7f65214</span></button></div></a><div aria-labelledby="job_list___sub_heading_1137_1" data-parent="#job_list___sub_accordion_1137" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1137_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=194" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (194, 51), end pos: (194, 55)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 52</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -191,7 +191,7 @@ name="tatou_db_query_duration_seconds", help="Duration of DB operations (best-effort manual instrumentation)", label_names=("operation",), - buckets=(0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5), + buckets=(0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 1.25, 0.5, 1, 2.5), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T144952876825Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T144953751118Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.28s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1138"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1138_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1138_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1138_1"><button class="btn btn-outline-danger"><span class="job_id">1138 : Job ID 460af17e71e948feabf47ddb4b18aecd</span></button></div></a><div aria-labelledby="job_list___sub_heading_1138_1" data-parent="#job_list___sub_accordion_1138" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1138_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=194" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (194, 51), end pos: (194, 55)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 53</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -191,7 +191,7 @@ name="tatou_db_query_duration_seconds", help="Duration of DB operations (best-effort manual instrumentation)", label_names=("operation",), - buckets=(0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5), + buckets=(0.001, 0.005, 0.01, 0.025, 0.05, 0.1, -0.75, 0.5, 1, 2.5), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.16s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1139"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1139_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1139_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1139_1"><button class="btn btn-outline-danger"><span class="job_id">1139 : Job ID 95e5a2014b864913ae5f18e474870de8</span></button></div></a><div aria-labelledby="job_list___sub_heading_1139_1" data-parent="#job_list___sub_accordion_1139" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1139_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=194" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (194, 57), end pos: (194, 60)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 54</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -191,7 +191,7 @@ name="tatou_db_query_duration_seconds", help="Duration of DB operations (best-effort manual instrumentation)", label_names=("operation",), - buckets=(0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5), + buckets=(0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 1.5, 1, 2.5), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.79s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1140"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1140_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1140_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1140_1"><button class="btn btn-outline-danger"><span class="job_id">1140 : Job ID 9bf39f8380eb46f49bed07e76710bc25</span></button></div></a><div aria-labelledby="job_list___sub_heading_1140_1" data-parent="#job_list___sub_accordion_1140" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1140_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=194" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (194, 57), end pos: (194, 60)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 55</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -191,7 +191,7 @@ name="tatou_db_query_duration_seconds", help="Duration of DB operations (best-effort manual instrumentation)", label_names=("operation",), - buckets=(0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5), + buckets=(0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, -0.5, 1, 2.5), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.07s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1141"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1141_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1141_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1141_1"><button class="btn btn-outline-success"><span class="job_id">1141 : Job ID 6d7ac314185b4c42b64da615d5429d1d</span></button></div></a><div aria-labelledby="job_list___sub_heading_1141_1" data-parent="#job_list___sub_accordion_1141" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1141_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=194" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (194, 62), end pos: (194, 63)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 56</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -191,7 +191,7 @@ name="tatou_db_query_duration_seconds", help="Duration of DB operations (best-effort manual instrumentation)", label_names=("operation",), - buckets=(0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5), + buckets=(0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 2, 2.5), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T194707213537Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T194708115582Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.87s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1142"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1142_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1142_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1142_1"><button class="btn btn-outline-success"><span class="job_id">1142 : Job ID 0e6d04af7eda412a8785da9e19ece4ec</span></button></div></a><div aria-labelledby="job_list___sub_heading_1142_1" data-parent="#job_list___sub_accordion_1142" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1142_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=194" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (194, 62), end pos: (194, 63)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 57</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -191,7 +191,7 @@ name="tatou_db_query_duration_seconds", help="Duration of DB operations (best-effort manual instrumentation)", label_names=("operation",), - buckets=(0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5), + buckets=(0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 0, 2.5), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T223625268575Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T223626119639Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.41s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1143"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1143_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1143_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1143_1"><button class="btn btn-outline-danger"><span class="job_id">1143 : Job ID fbeb8e1a8d6047c487f7638c3891454c</span></button></div></a><div aria-labelledby="job_list___sub_heading_1143_1" data-parent="#job_list___sub_accordion_1143" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1143_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=194" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (194, 65), end pos: (194, 68)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 58</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -191,7 +191,7 @@ name="tatou_db_query_duration_seconds", help="Duration of DB operations (best-effort manual instrumentation)", label_names=("operation",), - buckets=(0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5), + buckets=(0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 3.5), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.28s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1144"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1144_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1144_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1144_1"><button class="btn btn-outline-danger"><span class="job_id">1144 : Job ID 0b6341e97574479792cb493815006afa</span></button></div></a><div aria-labelledby="job_list___sub_heading_1144_1" data-parent="#job_list___sub_accordion_1144" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1144_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=194" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (194, 65), end pos: (194, 68)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 59</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -191,7 +191,7 @@ name="tatou_db_query_duration_seconds", help="Duration of DB operations (best-effort manual instrumentation)", label_names=("operation",), - buckets=(0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5), + buckets=(0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 1.5), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.36s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1145"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1145_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1145_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1145_1"><button class="btn btn-outline-danger"><span class="job_id">1145 : Job ID 3b942787860a4621829930108d407e5a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1145_1" data-parent="#job_list___sub_accordion_1145" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1145_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=202" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (202, 13), end pos: (202, 18)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 60</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -199,7 +199,7 @@ name="tatou_watermark_duration_seconds", help="Duration of watermark application per method", label_names=("method",), - buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10), + buckets=( 1.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.37s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1146"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1146_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1146_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1146_1"><button class="btn btn-outline-success"><span class="job_id">1146 : Job ID d2fcf5daa712480999a25f7fd43d40b6</span></button></div></a><div aria-labelledby="job_list___sub_heading_1146_1" data-parent="#job_list___sub_accordion_1146" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1146_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=202" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (202, 13), end pos: (202, 18)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 61</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -199,7 +199,7 @@ name="tatou_watermark_duration_seconds", help="Duration of watermark application per method", label_names=("method",), - buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10), + buckets=( -0.995, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T194540171272Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T194541187337Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.89s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1147"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1147_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1147_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1147_1"><button class="btn btn-outline-danger"><span class="job_id">1147 : Job ID d275279ca08049089458b9b4af84b8a8</span></button></div></a><div aria-labelledby="job_list___sub_heading_1147_1" data-parent="#job_list___sub_accordion_1147" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1147_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=202" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (202, 20), end pos: (202, 24)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 62</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -199,7 +199,7 @@ name="tatou_watermark_duration_seconds", help="Duration of watermark application per method", label_names=("method",), - buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10), + buckets=(0.005, 1.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.20s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1148"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1148_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1148_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1148_1"><button class="btn btn-outline-success"><span class="job_id">1148 : Job ID 054f2867a9b3480a8ba10061787176b5</span></button></div></a><div aria-labelledby="job_list___sub_heading_1148_1" data-parent="#job_list___sub_accordion_1148" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1148_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=202" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (202, 20), end pos: (202, 24)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 63</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -199,7 +199,7 @@ name="tatou_watermark_duration_seconds", help="Duration of watermark application per method", label_names=("method",), - buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10), + buckets=(0.005, -0.99, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T202223962468Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T202224813473Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.57s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1149"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1149_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1149_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1149_1"><button class="btn btn-outline-danger"><span class="job_id">1149 : Job ID 50236e31580649feaa972e0cec01c830</span></button></div></a><div aria-labelledby="job_list___sub_heading_1149_1" data-parent="#job_list___sub_accordion_1149" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1149_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=202" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (202, 26), end pos: (202, 31)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 64</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -199,7 +199,7 @@ name="tatou_watermark_duration_seconds", help="Duration of watermark application per method", label_names=("method",), - buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10), + buckets=(0.005, 0.01, 1.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.12s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1150"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1150_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1150_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1150_1"><button class="btn btn-outline-danger"><span class="job_id">1150 : Job ID e8cfdf312d904203912579e8e865d802</span></button></div></a><div aria-labelledby="job_list___sub_heading_1150_1" data-parent="#job_list___sub_accordion_1150" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1150_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=202" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (202, 26), end pos: (202, 31)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 65</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -199,7 +199,7 @@ name="tatou_watermark_duration_seconds", help="Duration of watermark application per method", label_names=("method",), - buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10), + buckets=(0.005, 0.01, -0.975, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.10s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1151"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1151_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1151_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1151_1"><button class="btn btn-outline-success"><span class="job_id">1151 : Job ID b79f7170d54f44c9b2063a687fd71039</span></button></div></a><div aria-labelledby="job_list___sub_heading_1151_1" data-parent="#job_list___sub_accordion_1151" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1151_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=202" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (202, 33), end pos: (202, 37)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 66</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -199,7 +199,7 @@ name="tatou_watermark_duration_seconds", help="Duration of watermark application per method", label_names=("method",), - buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10), + buckets=(0.005, 0.01, 0.025, 1.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T022638433654Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T022639339457Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.36s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1152"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1152_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1152_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1152_1"><button class="btn btn-outline-danger"><span class="job_id">1152 : Job ID 18b3841363484bb7b2b801575df9d96e</span></button></div></a><div aria-labelledby="job_list___sub_heading_1152_1" data-parent="#job_list___sub_accordion_1152" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1152_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=202" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (202, 33), end pos: (202, 37)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 67</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -199,7 +199,7 @@ name="tatou_watermark_duration_seconds", help="Duration of watermark application per method", label_names=("method",), - buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10), + buckets=(0.005, 0.01, 0.025, -0.95, 0.1, 0.25, 0.5, 1, 2.5, 5, 10), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.25s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1153"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1153_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1153_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1153_1"><button class="btn btn-outline-danger"><span class="job_id">1153 : Job ID 3711bd75061a4cdfb783ea9c264ed277</span></button></div></a><div aria-labelledby="job_list___sub_heading_1153_1" data-parent="#job_list___sub_accordion_1153" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1153_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=202" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (202, 39), end pos: (202, 42)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 68</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -199,7 +199,7 @@ name="tatou_watermark_duration_seconds", help="Duration of watermark application per method", label_names=("method",), - buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10), + buckets=(0.005, 0.01, 0.025, 0.05, 1.1, 0.25, 0.5, 1, 2.5, 5, 10), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.47s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1154"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1154_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1154_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1154_1"><button class="btn btn-outline-success"><span class="job_id">1154 : Job ID 538a0c2a79334f4cbbd3d35f232fd0de</span></button></div></a><div aria-labelledby="job_list___sub_heading_1154_1" data-parent="#job_list___sub_accordion_1154" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1154_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=202" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (202, 39), end pos: (202, 42)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 69</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -199,7 +199,7 @@ name="tatou_watermark_duration_seconds", help="Duration of watermark application per method", label_names=("method",), - buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10), + buckets=(0.005, 0.01, 0.025, 0.05, -0.9, 0.25, 0.5, 1, 2.5, 5, 10), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e50ce8a7b9fb1d713: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 20.04s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1155"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1155_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1155_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1155_1"><button class="btn btn-outline-success"><span class="job_id">1155 : Job ID 7825219ef52f45f3ab787e751dfec0bc</span></button></div></a><div aria-labelledby="job_list___sub_heading_1155_1" data-parent="#job_list___sub_accordion_1155" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1155_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=202" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (202, 44), end pos: (202, 48)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 70</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -199,7 +199,7 @@ name="tatou_watermark_duration_seconds", help="Duration of watermark application per method", label_names=("method",), - buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10), + buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 1.25, 0.5, 1, 2.5, 5, 10), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T184800629029Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T184801621438Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.74s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1156"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1156_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1156_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1156_1"><button class="btn btn-outline-danger"><span class="job_id">1156 : Job ID 2cf5f91246914016af29baa478376ceb</span></button></div></a><div aria-labelledby="job_list___sub_heading_1156_1" data-parent="#job_list___sub_accordion_1156" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1156_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=202" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (202, 44), end pos: (202, 48)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 71</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -199,7 +199,7 @@ name="tatou_watermark_duration_seconds", help="Duration of watermark application per method", label_names=("method",), - buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10), + buckets=(0.005, 0.01, 0.025, 0.05, 0.1, -0.75, 0.5, 1, 2.5, 5, 10), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.61s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1157"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1157_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1157_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1157_1"><button class="btn btn-outline-danger"><span class="job_id">1157 : Job ID 9ea9ee3d4c3e4ebcac2f6d37f20ec78e</span></button></div></a><div aria-labelledby="job_list___sub_heading_1157_1" data-parent="#job_list___sub_accordion_1157" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1157_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=202" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (202, 50), end pos: (202, 53)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 72</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -199,7 +199,7 @@ name="tatou_watermark_duration_seconds", help="Duration of watermark application per method", label_names=("method",), - buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10), + buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 1.5, 1, 2.5, 5, 10), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.20s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1158"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1158_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1158_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1158_1"><button class="btn btn-outline-danger"><span class="job_id">1158 : Job ID 8df8513f5ec1438fa68ebfcece912ed7</span></button></div></a><div aria-labelledby="job_list___sub_heading_1158_1" data-parent="#job_list___sub_accordion_1158" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1158_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=202" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (202, 50), end pos: (202, 53)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 73</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -199,7 +199,7 @@ name="tatou_watermark_duration_seconds", help="Duration of watermark application per method", label_names=("method",), - buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10), + buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, -0.5, 1, 2.5, 5, 10), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.79s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1159"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1159_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1159_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1159_1"><button class="btn btn-outline-success"><span class="job_id">1159 : Job ID b783f0d0352343bfb2a12dc0794c2d7b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1159_1" data-parent="#job_list___sub_accordion_1159" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1159_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=202" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (202, 55), end pos: (202, 56)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 74</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -199,7 +199,7 @@ name="tatou_watermark_duration_seconds", help="Duration of watermark application per method", label_names=("method",), - buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10), + buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 2, 2.5, 5, 10), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T213306837019Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T213307722939Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.37s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1160"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1160_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1160_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1160_1"><button class="btn btn-outline-danger"><span class="job_id">1160 : Job ID ed88e04cb92a4c02b1c2664fb539ff94</span></button></div></a><div aria-labelledby="job_list___sub_heading_1160_1" data-parent="#job_list___sub_accordion_1160" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1160_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=202" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (202, 55), end pos: (202, 56)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 75</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -199,7 +199,7 @@ name="tatou_watermark_duration_seconds", help="Duration of watermark application per method", label_names=("method",), - buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10), + buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 0, 2.5, 5, 10), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.05s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1161"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1161_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1161_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1161_1"><button class="btn btn-outline-danger"><span class="job_id">1161 : Job ID 1bb47d05545b4c8cab84b9d3b76c2f1d</span></button></div></a><div aria-labelledby="job_list___sub_heading_1161_1" data-parent="#job_list___sub_accordion_1161" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1161_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=202" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (202, 58), end pos: (202, 61)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 76</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -199,7 +199,7 @@ name="tatou_watermark_duration_seconds", help="Duration of watermark application per method", label_names=("method",), - buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10), + buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 3.5, 5, 10), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.16s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1162"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1162_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1162_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1162_1"><button class="btn btn-outline-danger"><span class="job_id">1162 : Job ID a466d404a2a1408ab412075fd623a9b5</span></button></div></a><div aria-labelledby="job_list___sub_heading_1162_1" data-parent="#job_list___sub_accordion_1162" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1162_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=202" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (202, 58), end pos: (202, 61)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 77</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -199,7 +199,7 @@ name="tatou_watermark_duration_seconds", help="Duration of watermark application per method", label_names=("method",), - buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10), + buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 1.5, 5, 10), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.92s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1163"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1163_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1163_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1163_1"><button class="btn btn-outline-success"><span class="job_id">1163 : Job ID 26004092dfdc42a1b4f5b9e90fbc65dd</span></button></div></a><div aria-labelledby="job_list___sub_heading_1163_1" data-parent="#job_list___sub_accordion_1163" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1163_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=202" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (202, 63), end pos: (202, 64)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 78</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -199,7 +199,7 @@ name="tatou_watermark_duration_seconds", help="Duration of watermark application per method", label_names=("method",), - buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10), + buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 6, 10), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614eaf00d2435a860c05: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 21.00s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1164"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1164_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1164_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1164_1"><button class="btn btn-outline-success"><span class="job_id">1164 : Job ID a48b4df5658c491392e7bedadd7a99c8</span></button></div></a><div aria-labelledby="job_list___sub_heading_1164_1" data-parent="#job_list___sub_accordion_1164" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1164_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=202" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (202, 63), end pos: (202, 64)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 79</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -199,7 +199,7 @@ name="tatou_watermark_duration_seconds", help="Duration of watermark application per method", label_names=("method",), - buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10), + buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 4, 10), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T165301383420Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T165302282976Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.33s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1165"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1165_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1165_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1165_1"><button class="btn btn-outline-danger"><span class="job_id">1165 : Job ID 20393fddfd524e0cbe240f0f9fe8e6aa</span></button></div></a><div aria-labelledby="job_list___sub_heading_1165_1" data-parent="#job_list___sub_accordion_1165" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1165_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=202" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (202, 66), end pos: (202, 68)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 80</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -199,7 +199,7 @@ name="tatou_watermark_duration_seconds", help="Duration of watermark application per method", label_names=("method",), - buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10), + buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 11), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.50s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1166"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1166_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1166_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1166_1"><button class="btn btn-outline-danger"><span class="job_id">1166 : Job ID 2ec93b5bfc644230ba622f2ffaac7468</span></button></div></a><div aria-labelledby="job_list___sub_heading_1166_1" data-parent="#job_list___sub_accordion_1166" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1166_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=202" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (202, 66), end pos: (202, 68)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 81</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -199,7 +199,7 @@ name="tatou_watermark_duration_seconds", help="Duration of watermark application per method", label_names=("method",), - buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10), + buckets=(0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 9), counts={}, sums={}, )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.44s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1167"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1167_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1167_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1167_1"><button class="btn btn-outline-success"><span class="job_id">1167 : Job ID b513dd688f0b4a96ab72e9ec82fc312f</span></button></div></a><div aria-labelledby="job_list___sub_heading_1167_1" data-parent="#job_list___sub_accordion_1167" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1167_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=211" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (211, 8), end pos: (211, 11)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 82</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -207,8 +207,7 @@ name="tatou_http_request_body_bytes", help="Request body sizes in bytes (Content-Length if present)", label_names=("method", "route"), - buckets=( - 100, + buckets=( 101, 500, 1_000, 5_000,</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%]</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1168"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1168_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1168_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1168_1"><button class="btn btn-outline-danger"><span class="job_id">1168 : Job ID af7eea1fc17c48ed9d0ba6cf531efc4a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1168_1" data-parent="#job_list___sub_accordion_1168" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1168_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=211" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (211, 8), end pos: (211, 11)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 83</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -207,8 +207,7 @@ name="tatou_http_request_body_bytes", help="Request body sizes in bytes (Content-Length if present)", label_names=("method", "route"), - buckets=( - 100, + buckets=( 99, 500, 1_000, 5_000,</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.20s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1169"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1169_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1169_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1169_1"><button class="btn btn-outline-danger"><span class="job_id">1169 : Job ID 1608ee776c9d43caa8b2b452123571d1</span></button></div></a><div aria-labelledby="job_list___sub_heading_1169_1" data-parent="#job_list___sub_accordion_1169" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1169_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=212" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (212, 8), end pos: (212, 11)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 84</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -208,8 +208,7 @@ help="Request body sizes in bytes (Content-Length if present)", label_names=("method", "route"), buckets=( - 100, - 500, + 100, 501, 1_000, 5_000, 10_000,</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.15s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1170"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1170_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1170_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1170_1"><button class="btn btn-outline-danger"><span class="job_id">1170 : Job ID d0d59b007f334505a2372bc8fcba7b9b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1170_1" data-parent="#job_list___sub_accordion_1170" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1170_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=212" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (212, 8), end pos: (212, 11)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 85</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -208,8 +208,7 @@ help="Request body sizes in bytes (Content-Length if present)", label_names=("method", "route"), buckets=( - 100, - 500, + 100, 499, 1_000, 5_000, 10_000,</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.06s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1171"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1171_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1171_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1171_1"><button class="btn btn-outline-danger"><span class="job_id">1171 : Job ID c73f74b82f784fb8aaee0539357a0caa</span></button></div></a><div aria-labelledby="job_list___sub_heading_1171_1" data-parent="#job_list___sub_accordion_1171" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1171_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=213" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (213, 8), end pos: (213, 13)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 86</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -209,8 +209,7 @@ label_names=("method", "route"), buckets=( 100, - 500, - 1_000, + 500, 1001, 5_000, 10_000, 50_000,</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.20s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1172"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1172_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1172_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1172_1"><button class="btn btn-outline-danger"><span class="job_id">1172 : Job ID c1d59579e94446f7b0e20e439e9ddb40</span></button></div></a><div aria-labelledby="job_list___sub_heading_1172_1" data-parent="#job_list___sub_accordion_1172" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1172_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=213" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (213, 8), end pos: (213, 13)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 87</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -209,8 +209,7 @@ label_names=("method", "route"), buckets=( 100, - 500, - 1_000, + 500, 999, 5_000, 10_000, 50_000,</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.05s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1173"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1173_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1173_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1173_1"><button class="btn btn-outline-success"><span class="job_id">1173 : Job ID 35452c677f5c41bf8008d4bf6d518f12</span></button></div></a><div aria-labelledby="job_list___sub_heading_1173_1" data-parent="#job_list___sub_accordion_1173" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1173_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=214" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (214, 8), end pos: (214, 13)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 88</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -210,8 +210,7 @@ buckets=( 100, 500, - 1_000, - 5_000, + 1_000, 5001, 10_000, 50_000, 100_000,</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T002449495575Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T002450384804Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.29s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1174"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1174_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1174_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1174_1"><button class="btn btn-outline-success"><span class="job_id">1174 : Job ID 5dedc649834f46048b140060aa7a887e</span></button></div></a><div aria-labelledby="job_list___sub_heading_1174_1" data-parent="#job_list___sub_accordion_1174" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1174_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=214" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (214, 8), end pos: (214, 13)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 89</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -210,8 +210,7 @@ buckets=( 100, 500, - 1_000, - 5_000, + 1_000, 4999, 10_000, 50_000, 100_000,</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614eee0a4cb22dbe3442: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.78s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1175"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1175_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1175_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1175_1"><button class="btn btn-outline-success"><span class="job_id">1175 : Job ID 98c8037185e04b0bb9fb573fd680bbba</span></button></div></a><div aria-labelledby="job_list___sub_heading_1175_1" data-parent="#job_list___sub_accordion_1175" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1175_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=215" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (215, 8), end pos: (215, 14)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 90</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -211,8 +211,7 @@ 100, 500, 1_000, - 5_000, - 10_000, + 5_000, 10001, 50_000, 100_000, 500_000,</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T005815688158Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T005816577821Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.31s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1176"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1176_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1176_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1176_1"><button class="btn btn-outline-success"><span class="job_id">1176 : Job ID 7a72708e4f3945d1b64060ac05987112</span></button></div></a><div aria-labelledby="job_list___sub_heading_1176_1" data-parent="#job_list___sub_accordion_1176" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1176_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=215" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (215, 8), end pos: (215, 14)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 91</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -211,8 +211,7 @@ 100, 500, 1_000, - 5_000, - 10_000, + 5_000, 9999, 50_000, 100_000, 500_000,</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T141623709206Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T141624552370Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.40s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1177"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1177_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1177_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1177_1"><button class="btn btn-outline-danger"><span class="job_id">1177 : Job ID 3a62f33a25fc47689c711c54bf46824b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1177_1" data-parent="#job_list___sub_accordion_1177" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1177_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=216" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (216, 8), end pos: (216, 14)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 92</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -212,8 +212,7 @@ 500, 1_000, 5_000, - 10_000, - 50_000, + 10_000, 50001, 100_000, 500_000, 1_000_000,</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.26s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1178"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1178_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1178_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1178_1"><button class="btn btn-outline-danger"><span class="job_id">1178 : Job ID 02de587479164de7a0259f91eb9050f4</span></button></div></a><div aria-labelledby="job_list___sub_heading_1178_1" data-parent="#job_list___sub_accordion_1178" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1178_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=216" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (216, 8), end pos: (216, 14)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 93</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -212,8 +212,7 @@ 500, 1_000, 5_000, - 10_000, - 50_000, + 10_000, 49999, 100_000, 500_000, 1_000_000,</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.08s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1179"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1179_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1179_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1179_1"><button class="btn btn-outline-danger"><span class="job_id">1179 : Job ID 1c437a39cbb44a67bf07a580b5d452a1</span></button></div></a><div aria-labelledby="job_list___sub_heading_1179_1" data-parent="#job_list___sub_accordion_1179" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1179_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=217" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (217, 8), end pos: (217, 15)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 94</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -213,8 +213,7 @@ 1_000, 5_000, 10_000, - 50_000, - 100_000, + 50_000, 100001, 500_000, 1_000_000, 5_000_000,</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.99s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1180"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1180_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1180_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1180_1"><button class="btn btn-outline-danger"><span class="job_id">1180 : Job ID 4a9f77ed7ab04e4b95bc5f2a4b01d4da</span></button></div></a><div aria-labelledby="job_list___sub_heading_1180_1" data-parent="#job_list___sub_accordion_1180" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1180_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=217" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (217, 8), end pos: (217, 15)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 95</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -213,8 +213,7 @@ 1_000, 5_000, 10_000, - 50_000, - 100_000, + 50_000, 99999, 500_000, 1_000_000, 5_000_000,</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.06s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1181"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1181_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1181_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1181_1"><button class="btn btn-outline-danger"><span class="job_id">1181 : Job ID 6dfd4944c1144f3fb30b4a026e190a11</span></button></div></a><div aria-labelledby="job_list___sub_heading_1181_1" data-parent="#job_list___sub_accordion_1181" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1181_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=218" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (218, 8), end pos: (218, 15)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 96</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -214,8 +214,7 @@ 5_000, 10_000, 50_000, - 100_000, - 500_000, + 100_000, 500001, 1_000_000, 5_000_000, 25_000_000,</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.96s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1182"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1182_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1182_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1182_1"><button class="btn btn-outline-success"><span class="job_id">1182 : Job ID 06df75033f544bf79d16eb89477e79c8</span></button></div></a><div aria-labelledby="job_list___sub_heading_1182_1" data-parent="#job_list___sub_accordion_1182" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1182_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=218" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (218, 8), end pos: (218, 15)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 97</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -214,8 +214,7 @@ 5_000, 10_000, 50_000, - 100_000, - 500_000, + 100_000, 499999, 1_000_000, 5_000_000, 25_000_000,</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T182450210745Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T182451077374Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.70s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1183"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1183_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1183_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1183_1"><button class="btn btn-outline-success"><span class="job_id">1183 : Job ID 77851cd59af94a3294114c3291a9a878</span></button></div></a><div aria-labelledby="job_list___sub_heading_1183_1" data-parent="#job_list___sub_accordion_1183" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1183_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=219" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (219, 8), end pos: (219, 17)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 98</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -215,8 +215,7 @@ 10_000, 50_000, 100_000, - 500_000, - 1_000_000, + 500_000, 1000001, 5_000_000, 25_000_000, 50_000_000,</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e204cae2bffdd28b0: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.72s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1184"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1184_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1184_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1184_1"><button class="btn btn-outline-danger"><span class="job_id">1184 : Job ID 5a82f9af160943a5946799a2a6b6b614</span></button></div></a><div aria-labelledby="job_list___sub_heading_1184_1" data-parent="#job_list___sub_accordion_1184" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1184_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=219" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (219, 8), end pos: (219, 17)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 99</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -215,8 +215,7 @@ 10_000, 50_000, 100_000, - 500_000, - 1_000_000, + 500_000, 999999, 5_000_000, 25_000_000, 50_000_000,</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.05s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1185"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1185_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1185_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1185_1"><button class="btn btn-outline-danger"><span class="job_id">1185 : Job ID df63a35eb6cd46c69245fb3ab5d3dc76</span></button></div></a><div aria-labelledby="job_list___sub_heading_1185_1" data-parent="#job_list___sub_accordion_1185" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1185_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=220" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (220, 8), end pos: (220, 17)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 100</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -216,8 +216,7 @@ 50_000, 100_000, 500_000, - 1_000_000, - 5_000_000, + 1_000_000, 5000001, 25_000_000, 50_000_000, ),</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.14s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1186"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1186_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1186_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1186_1"><button class="btn btn-outline-success"><span class="job_id">1186 : Job ID a1959cc761784d3f82492095e21489ba</span></button></div></a><div aria-labelledby="job_list___sub_heading_1186_1" data-parent="#job_list___sub_accordion_1186" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1186_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=220" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (220, 8), end pos: (220, 17)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 101</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -216,8 +216,7 @@ 50_000, 100_000, 500_000, - 1_000_000, - 5_000_000, + 1_000_000, 4999999, 25_000_000, 50_000_000, ),</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T000351854104Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T000352772993Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.23s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1187"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1187_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1187_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1187_1"><button class="btn btn-outline-danger"><span class="job_id">1187 : Job ID 90ddeb3962d941eebde48bd7a6564f13</span></button></div></a><div aria-labelledby="job_list___sub_heading_1187_1" data-parent="#job_list___sub_accordion_1187" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1187_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=221" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (221, 8), end pos: (221, 18)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 102</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -217,8 +217,7 @@ 100_000, 500_000, 1_000_000, - 5_000_000, - 25_000_000, + 5_000_000, 25000001, 50_000_000, ), counts={},</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.79s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1188"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1188_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1188_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1188_1"><button class="btn btn-outline-success"><span class="job_id">1188 : Job ID 5c85ab4f113f4d5eba2abb44eb2d0f61</span></button></div></a><div aria-labelledby="job_list___sub_heading_1188_1" data-parent="#job_list___sub_accordion_1188" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1188_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=221" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (221, 8), end pos: (221, 18)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 103</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -217,8 +217,7 @@ 100_000, 500_000, 1_000_000, - 5_000_000, - 25_000_000, + 5_000_000, 24999999, 50_000_000, ), counts={},</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T021447644031Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T021448577217Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.37s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1189"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1189_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1189_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1189_1"><button class="btn btn-outline-danger"><span class="job_id">1189 : Job ID 1c13bf6a162d439fb41ac7741d1520a7</span></button></div></a><div aria-labelledby="job_list___sub_heading_1189_1" data-parent="#job_list___sub_accordion_1189" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1189_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=222" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (222, 8), end pos: (222, 18)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 104</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -218,8 +218,7 @@ 500_000, 1_000_000, 5_000_000, - 25_000_000, - 50_000_000, + 25_000_000, 50000001, ), counts={}, sums={},</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.14s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1190"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1190_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1190_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1190_1"><button class="btn btn-outline-danger"><span class="job_id">1190 : Job ID 95cfa4a79e2246dfad71e6408f567053</span></button></div></a><div aria-labelledby="job_list___sub_heading_1190_1" data-parent="#job_list___sub_accordion_1190" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1190_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=222" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (222, 8), end pos: (222, 18)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 105</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -218,8 +218,7 @@ 500_000, 1_000_000, 5_000_000, - 25_000_000, - 50_000_000, + 25_000_000, 49999999, ), counts={}, sums={},</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.09s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1191"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1191_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1191_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1191_1"><button class="btn btn-outline-danger"><span class="job_id">1191 : Job ID ccbbf93cc6be407c84b71b10c810b3f1</span></button></div></a><div aria-labelledby="job_list___sub_heading_1191_1" data-parent="#job_list___sub_accordion_1191" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1191_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=254" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (254, 36), end pos: (254, 37)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 106</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -251,7 +251,7 @@ # decrement in-flight if previously incremented key = (route,) if INFLIGHT.values.get(key): - INFLIGHT.values[key] -= 1 + INFLIGHT.values[key] -= 2 def inc_inflight(route: str) -&gt; None:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.68s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1192"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1192_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1192_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1192_1"><button class="btn btn-outline-danger"><span class="job_id">1192 : Job ID b0d5760ae1dc496ab0c0227a022cb7e9</span></button></div></a><div aria-labelledby="job_list___sub_heading_1192_1" data-parent="#job_list___sub_accordion_1192" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1192_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=254" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (254, 36), end pos: (254, 37)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 107</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -251,7 +251,7 @@ # decrement in-flight if previously incremented key = (route,) if INFLIGHT.values.get(key): - INFLIGHT.values[key] -= 1 + INFLIGHT.values[key] -= 0 def inc_inflight(route: str) -&gt; None:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.12s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1193"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1193_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1193_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1193_1"><button class="btn btn-outline-danger"><span class="job_id">1193 : Job ID bdf24f67f364422db21d4bf5036da83c</span></button></div></a><div aria-labelledby="job_list___sub_heading_1193_1" data-parent="#job_list___sub_accordion_1193" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1193_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=263" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (263, 30), end pos: (263, 31)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 108</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -260,7 +260,7 @@ def observe_request_size(method: str, route: str, size: int | None) -&gt; None: - if size is None or size &lt; 0: + if size is None or size &lt; 1: return with _lock: REQUEST_BODY_SIZE.observe(float(size), method, route)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.89s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1194"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1194_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1194_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1194_1"><button class="btn btn-outline-danger"><span class="job_id">1194 : Job ID ec7c93414c03428a93ff60e3a21f781b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1194_1" data-parent="#job_list___sub_accordion_1194" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1194_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=263" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (263, 30), end pos: (263, 31)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 109</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -260,7 +260,7 @@ def observe_request_size(method: str, route: str, size: int | None) -&gt; None: - if size is None or size &lt; 0: + if size is None or size &lt; -1: return with _lock: REQUEST_BODY_SIZE.observe(float(size), method, route)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.25s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1195"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1195_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1195_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1195_1"><button class="btn btn-outline-success"><span class="job_id">1195 : Job ID 6ad10a4e0992410583748d3c598389f2</span></button></div></a><div aria-labelledby="job_list___sub_heading_1195_1" data-parent="#job_list___sub_accordion_1195" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1195_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=28" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (28, 0), end pos: (29, 0)</button></a></pre><pre>operator: core/RemoveDecorator, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -23,9 +23,6 @@ from dataclasses import dataclass from threading import Lock from time import time - - -@dataclass(slots=True) class CounterMetric: name: str help: str</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:17: in &lt;module&gt; from observability import ( observability.py:113: in &lt;module&gt; REQUESTS = CounterMetric( E TypeError: CounterMetric() takes no arguments ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-17T03:05:02+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T03:05:02+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_user-files Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_user-files Resource is still in use Volume softsec-tatou_db-data Removed Network softsec-tatou_default Removed time="2025-10-17T03:05:03+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T03:05:03+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: CounterMetric() takes no arguments !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 7 warnings, 1 error in 13.09s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1196"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1196_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1196_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1196_1"><button class="btn btn-outline-success"><span class="job_id">1196 : Job ID 77d34aa3177b4d0aa3ef14e4abd321e7</span></button></div></a><div aria-labelledby="job_list___sub_heading_1196_1" data-parent="#job_list___sub_accordion_1196" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1196_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=53" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (53, 0), end pos: (54, 0)</button></a></pre><pre>operator: core/RemoveDecorator, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -48,9 +48,6 @@ ) lines.append(f"{self.name}{{{label_frag}}} {value}") return "\n".join(lines) - - -@dataclass(slots=True) class HistogramMetric: name: str help: str</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:17: in &lt;module&gt; from observability import ( observability.py:119: in &lt;module&gt; REQUEST_LATENCY = HistogramMetric( E TypeError: HistogramMetric() takes no arguments ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T17:54:04+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T17:54:05+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_user-files Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_grafana-data Resource is still in use Volume softsec-tatou_db-data Removed Network softsec-tatou_default Removed time="2025-10-16T17:54:06+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T17:54:06+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: HistogramMetric() takes no arguments !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 7 warnings, 1 error in 13.03s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1197"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1197_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1197_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1197_1"><button class="btn btn-outline-danger"><span class="job_id">1197 : Job ID 738e396a6b294ef789d1b48224512b0c</span></button></div></a><div aria-labelledby="job_list___sub_heading_1197_1" data-parent="#job_list___sub_accordion_1197" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1197_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=44" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (44, 29), end pos: (44, 56)</button></a></pre><pre>operator: core/ZeroIterationForLoop, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -41,7 +41,7 @@ def render(self) -&gt; str: lines = [f"# HELP {self.name} {self.help}", f"# TYPE {self.name} counter"] - for labels, value in sorted(self.values.items()): + for labels, value in []: label_frag = ",".join( f"{k}={_quote(v)}" for k, v in zip(self.label_names, labels, strict=True)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.48s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1198"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1198_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1198_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1198_1"><button class="btn btn-outline-success"><span class="job_id">1198 : Job ID 743c5fb7b9af4d2c9bd66124f926a512</span></button></div></a><div aria-labelledby="job_list___sub_heading_1198_1" data-parent="#job_list___sub_accordion_1198" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1198_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=70" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (70, 17), end pos: (70, 29)</button></a></pre><pre>operator: core/ZeroIterationForLoop, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -67,7 +67,7 @@ labels = tuple(label_values) # Increment every bucket whose upper bound is &gt;= value so that # stored counts are already cumulative (Prometheus expectation). - for b in self.buckets: + for b in []: if value &lt;= b: self.counts[(labels, b)] = self.counts.get((labels, b), 0) + 1 # Always increment +Inf bucket count</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T035732035589Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T035733165604Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 20.60s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1199"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1199_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1199_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1199_1"><button class="btn btn-outline-danger"><span class="job_id">1199 : Job ID 0b21b36ece7141d283762fa4983cae9b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1199_1" data-parent="#job_list___sub_accordion_1199" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1199_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=86" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (86, 22), end pos: (86, 32)</button></a></pre><pre>operator: core/ZeroIterationForLoop, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -83,7 +83,7 @@ # &lt;name&gt;_count{...} &lt;total&gt; lines = [f"# HELP {self.name} {self.help}", f"# TYPE {self.name} histogram"] label_sets = sorted({lbl for (lbl, _le) in self.counts.keys()}) - for labels in label_sets: + for labels in []: label_frag = ",".join( f"{k}={_quote(v)}" for k, v in zip(self.label_names, labels, strict=True)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.31s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1200"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1200_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1200_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1200_1"><button class="btn btn-outline-success"><span class="job_id">1200 : Job ID d73ebbe6079043d4bdc4b5077be470b7</span></button></div></a><div aria-labelledby="job_list___sub_heading_1200_1" data-parent="#job_list___sub_accordion_1200" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1200_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=observability.py&amp;line=92" class="text-secondary"><button class="btn btn-outline-dark">observability.py, start pos: (92, 21), end pos: (92, 33)</button></a></pre><pre>operator: core/ZeroIterationForLoop, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aobservability.py +++ bobservability.py @@ -89,7 +89,7 @@ for k, v in zip(self.label_names, labels, strict=True) ) # Emit stored cumulative counts for each finite bucket - for b in self.buckets: + for b in []: c = self.counts.get((labels, b), 0) lines.append( f"{self.name}_bucket{{{label_frag},le={_quote(repr(b))}}} {c}"</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T221720819984Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T221721683285Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.90s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1201"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1201_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1201_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1201_1"><button class="btn btn-outline-success"><span class="job_id">1201 : Job ID 5f5dbc8173524da3ba4c836250482f7c</span></button></div></a><div aria-labelledby="job_list___sub_heading_1201_1" data-parent="#job_list___sub_accordion_1201" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1201_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=105" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (105, 27), end pos: (105, 28)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Sub, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -102,7 +102,7 @@ out = data if not out.endswith(b"\n"): out += b"\n" - out += self._MAGIC + payload + b"\n" + out += self._MAGIC - payload + b"\n" return out def is_watermark_applicable(</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T061835060378Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T061836026996Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 20.05s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1202"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1202_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1202_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1202_1"><button class="btn btn-outline-danger"><span class="job_id">1202 : Job ID 69d4d79f343346b293c84bd5379a2a5e</span></button></div></a><div aria-labelledby="job_list___sub_heading_1202_1" data-parent="#job_list___sub_accordion_1202" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1202_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=105" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (105, 37), end pos: (105, 38)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Sub, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -102,7 +102,7 @@ out = data if not out.endswith(b"\n"): out += b"\n" - out += self._MAGIC + payload + b"\n" + out += self._MAGIC + payload - b"\n" return out def is_watermark_applicable(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.59s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1203"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1203_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1203_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1203_1"><button class="btn btn-outline-danger"><span class="job_id">1203 : Job ID a37d8b8575cd40bf808cb5b05c77dbf0</span></button></div></a><div aria-labelledby="job_list___sub_heading_1203_1" data-parent="#job_list___sub_accordion_1203" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1203_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=130" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (130, 20), end pos: (130, 21)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Sub, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -127,7 +127,7 @@ if idx == -1: raise SecretNotFoundError("No AddAfterEOF watermark found") - start = idx + len(self._MAGIC) + start = idx - len(self._MAGIC) # Payload ends at the next newline or EOF end_nl = data.find(b"\n", start) end = len(data) if end_nl == -1 else end_nl</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.39s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1204"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1204_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1204_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1204_1"><button class="btn btn-outline-success"><span class="job_id">1204 : Job ID bf97fd137dde4702b03350d7d28fb570</span></button></div></a><div aria-labelledby="job_list___sub_heading_1204_1" data-parent="#job_list___sub_accordion_1204" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1204_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=184" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (184, 57), end pos: (184, 58)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Sub, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -181,7 +181,7 @@ def _mac_hex(self, secret_bytes: bytes, key: str) -&gt; str: """Compute HMAC-SHA256 over the contextualized secret and return hex.""" - hm = hmac.new(key.encode("utf-8"), self._CONTEXT + secret_bytes, hashlib.sha256) + hm = hmac.new(key.encode("utf-8"), self._CONTEXT - secret_bytes, hashlib.sha256) return hm.hexdigest() </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T043222410039Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T043223552968Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 20.44s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1205"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1205_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1205_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1205_1"><button class="btn btn-outline-danger"><span class="job_id">1205 : Job ID 697ab31f08e04bc9a32c6cb3db400921</span></button></div></a><div aria-labelledby="job_list___sub_heading_1205_1" data-parent="#job_list___sub_accordion_1205" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1205_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=105" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (105, 27), end pos: (105, 28)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Mul, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -102,7 +102,7 @@ out = data if not out.endswith(b"\n"): out += b"\n" - out += self._MAGIC + payload + b"\n" + out += self._MAGIC * payload + b"\n" return out def is_watermark_applicable(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.07s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1206"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1206_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1206_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1206_1"><button class="btn btn-outline-danger"><span class="job_id">1206 : Job ID ab541060a60f4f3b92384e835412d8af</span></button></div></a><div aria-labelledby="job_list___sub_heading_1206_1" data-parent="#job_list___sub_accordion_1206" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1206_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=105" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (105, 37), end pos: (105, 38)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Mul, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -102,7 +102,7 @@ out = data if not out.endswith(b"\n"): out += b"\n" - out += self._MAGIC + payload + b"\n" + out += self._MAGIC + payload * b"\n" return out def is_watermark_applicable(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.16s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1207"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1207_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1207_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1207_1"><button class="btn btn-outline-danger"><span class="job_id">1207 : Job ID 6befe374553641d8b623c4f48c674ffc</span></button></div></a><div aria-labelledby="job_list___sub_heading_1207_1" data-parent="#job_list___sub_accordion_1207" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1207_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=130" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (130, 20), end pos: (130, 21)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Mul, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -127,7 +127,7 @@ if idx == -1: raise SecretNotFoundError("No AddAfterEOF watermark found") - start = idx + len(self._MAGIC) + start = idx * len(self._MAGIC) # Payload ends at the next newline or EOF end_nl = data.find(b"\n", start) end = len(data) if end_nl == -1 else end_nl</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.95s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1208"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1208_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1208_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1208_1"><button class="btn btn-outline-danger"><span class="job_id">1208 : Job ID 0062dfc3c2a94c99ac4f0763c6a191b0</span></button></div></a><div aria-labelledby="job_list___sub_heading_1208_1" data-parent="#job_list___sub_accordion_1208" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1208_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=184" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (184, 57), end pos: (184, 58)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Mul, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -181,7 +181,7 @@ def _mac_hex(self, secret_bytes: bytes, key: str) -&gt; str: """Compute HMAC-SHA256 over the contextualized secret and return hex.""" - hm = hmac.new(key.encode("utf-8"), self._CONTEXT + secret_bytes, hashlib.sha256) + hm = hmac.new(key.encode("utf-8"), self._CONTEXT * secret_bytes, hashlib.sha256) return hm.hexdigest() </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.45s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1209"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1209_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1209_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1209_1"><button class="btn btn-outline-danger"><span class="job_id">1209 : Job ID 69ab9089fc404085b2b1d6b7eef15859</span></button></div></a><div aria-labelledby="job_list___sub_heading_1209_1" data-parent="#job_list___sub_accordion_1209" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1209_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=105" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (105, 27), end pos: (105, 28)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Div, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -102,7 +102,7 @@ out = data if not out.endswith(b"\n"): out += b"\n" - out += self._MAGIC + payload + b"\n" + out += self._MAGIC / payload + b"\n" return out def is_watermark_applicable(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.19s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1210"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1210_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1210_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1210_1"><button class="btn btn-outline-danger"><span class="job_id">1210 : Job ID d6efba0a94b84e9c87c11bb4ee05d316</span></button></div></a><div aria-labelledby="job_list___sub_heading_1210_1" data-parent="#job_list___sub_accordion_1210" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1210_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=105" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (105, 37), end pos: (105, 38)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Div, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -102,7 +102,7 @@ out = data if not out.endswith(b"\n"): out += b"\n" - out += self._MAGIC + payload + b"\n" + out += self._MAGIC + payload / b"\n" return out def is_watermark_applicable(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.22s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1211"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1211_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1211_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1211_1"><button class="btn btn-outline-success"><span class="job_id">1211 : Job ID 33ac0b63af384c719ba6b688f3958c7e</span></button></div></a><div aria-labelledby="job_list___sub_heading_1211_1" data-parent="#job_list___sub_accordion_1211" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1211_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=130" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (130, 20), end pos: (130, 21)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Div, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -127,7 +127,7 @@ if idx == -1: raise SecretNotFoundError("No AddAfterEOF watermark found") - start = idx + len(self._MAGIC) + start = idx / len(self._MAGIC) # Payload ends at the next newline or EOF end_nl = data.find(b"\n", start) end = len(data) if end_nl == -1 else end_nl</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T011733070699Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T011734010597Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.39s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1212"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1212_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1212_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1212_1"><button class="btn btn-outline-danger"><span class="job_id">1212 : Job ID b8b0093ccec0495d8b2d18bae66a0eca</span></button></div></a><div aria-labelledby="job_list___sub_heading_1212_1" data-parent="#job_list___sub_accordion_1212" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1212_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=184" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (184, 57), end pos: (184, 58)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Div, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -181,7 +181,7 @@ def _mac_hex(self, secret_bytes: bytes, key: str) -&gt; str: """Compute HMAC-SHA256 over the contextualized secret and return hex.""" - hm = hmac.new(key.encode("utf-8"), self._CONTEXT + secret_bytes, hashlib.sha256) + hm = hmac.new(key.encode("utf-8"), self._CONTEXT / secret_bytes, hashlib.sha256) return hm.hexdigest() </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.34s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1213"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1213_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1213_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1213_1"><button class="btn btn-outline-success"><span class="job_id">1213 : Job ID 86e350aff1c04676b01dff5a57dd3d83</span></button></div></a><div aria-labelledby="job_list___sub_heading_1213_1" data-parent="#job_list___sub_accordion_1213" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1213_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=105" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (105, 27), end pos: (105, 28)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_FloorDiv, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -102,7 +102,7 @@ out = data if not out.endswith(b"\n"): out += b"\n" - out += self._MAGIC + payload + b"\n" + out += self._MAGIC // payload + b"\n" return out def is_watermark_applicable(</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e2aad559a791f147a: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 21.45s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1214"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1214_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1214_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1214_1"><button class="btn btn-outline-danger"><span class="job_id">1214 : Job ID ff8cfa6cdd534193a66d1f4f12efff96</span></button></div></a><div aria-labelledby="job_list___sub_heading_1214_1" data-parent="#job_list___sub_accordion_1214" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1214_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=105" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (105, 37), end pos: (105, 38)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_FloorDiv, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -102,7 +102,7 @@ out = data if not out.endswith(b"\n"): out += b"\n" - out += self._MAGIC + payload + b"\n" + out += self._MAGIC + payload // b"\n" return out def is_watermark_applicable(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.28s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1215"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1215_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1215_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1215_1"><button class="btn btn-outline-danger"><span class="job_id">1215 : Job ID 6288e9d142eb46ddb6a924d39e29923b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1215_1" data-parent="#job_list___sub_accordion_1215" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1215_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=130" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (130, 20), end pos: (130, 21)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_FloorDiv, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -127,7 +127,7 @@ if idx == -1: raise SecretNotFoundError("No AddAfterEOF watermark found") - start = idx + len(self._MAGIC) + start = idx // len(self._MAGIC) # Payload ends at the next newline or EOF end_nl = data.find(b"\n", start) end = len(data) if end_nl == -1 else end_nl</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.38s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1216"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1216_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1216_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1216_1"><button class="btn btn-outline-danger"><span class="job_id">1216 : Job ID c3376e78596f44b493e419ebc19f3f28</span></button></div></a><div aria-labelledby="job_list___sub_heading_1216_1" data-parent="#job_list___sub_accordion_1216" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1216_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=184" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (184, 57), end pos: (184, 58)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_FloorDiv, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -181,7 +181,7 @@ def _mac_hex(self, secret_bytes: bytes, key: str) -&gt; str: """Compute HMAC-SHA256 over the contextualized secret and return hex.""" - hm = hmac.new(key.encode("utf-8"), self._CONTEXT + secret_bytes, hashlib.sha256) + hm = hmac.new(key.encode("utf-8"), self._CONTEXT // secret_bytes, hashlib.sha256) return hm.hexdigest() </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.51s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1217"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1217_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1217_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1217_1"><button class="btn btn-outline-danger"><span class="job_id">1217 : Job ID e9835d56451f4cf694059e0d44157a94</span></button></div></a><div aria-labelledby="job_list___sub_heading_1217_1" data-parent="#job_list___sub_accordion_1217" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1217_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=105" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (105, 27), end pos: (105, 28)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Mod, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -102,7 +102,7 @@ out = data if not out.endswith(b"\n"): out += b"\n" - out += self._MAGIC + payload + b"\n" + out += self._MAGIC % payload + b"\n" return out def is_watermark_applicable(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.46s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1218"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1218_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1218_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1218_1"><button class="btn btn-outline-danger"><span class="job_id">1218 : Job ID ea5709ec8054493d85a17df3c010cd46</span></button></div></a><div aria-labelledby="job_list___sub_heading_1218_1" data-parent="#job_list___sub_accordion_1218" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1218_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=105" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (105, 37), end pos: (105, 38)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Mod, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -102,7 +102,7 @@ out = data if not out.endswith(b"\n"): out += b"\n" - out += self._MAGIC + payload + b"\n" + out += self._MAGIC + payload % b"\n" return out def is_watermark_applicable(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.63s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1219"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1219_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1219_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1219_1"><button class="btn btn-outline-danger"><span class="job_id">1219 : Job ID 555137c94fd64d44b8c045f363798462</span></button></div></a><div aria-labelledby="job_list___sub_heading_1219_1" data-parent="#job_list___sub_accordion_1219" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1219_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=130" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (130, 20), end pos: (130, 21)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Mod, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -127,7 +127,7 @@ if idx == -1: raise SecretNotFoundError("No AddAfterEOF watermark found") - start = idx + len(self._MAGIC) + start = idx % len(self._MAGIC) # Payload ends at the next newline or EOF end_nl = data.find(b"\n", start) end = len(data) if end_nl == -1 else end_nl</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.27s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1220"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1220_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1220_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1220_1"><button class="btn btn-outline-danger"><span class="job_id">1220 : Job ID fc42251f0dd94b1e97dd06e888aad5db</span></button></div></a><div aria-labelledby="job_list___sub_heading_1220_1" data-parent="#job_list___sub_accordion_1220" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1220_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=184" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (184, 57), end pos: (184, 58)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Mod, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -181,7 +181,7 @@ def _mac_hex(self, secret_bytes: bytes, key: str) -&gt; str: """Compute HMAC-SHA256 over the contextualized secret and return hex.""" - hm = hmac.new(key.encode("utf-8"), self._CONTEXT + secret_bytes, hashlib.sha256) + hm = hmac.new(key.encode("utf-8"), self._CONTEXT % secret_bytes, hashlib.sha256) return hm.hexdigest() </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.39s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1221"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1221_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1221_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1221_1"><button class="btn btn-outline-danger"><span class="job_id">1221 : Job ID bca0381c9ca1481cb354c3712609e5cb</span></button></div></a><div aria-labelledby="job_list___sub_heading_1221_1" data-parent="#job_list___sub_accordion_1221" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1221_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=105" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (105, 27), end pos: (105, 28)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Pow, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -102,7 +102,7 @@ out = data if not out.endswith(b"\n"): out += b"\n" - out += self._MAGIC + payload + b"\n" + out += self._MAGIC ** payload + b"\n" return out def is_watermark_applicable(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.41s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1222"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1222_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1222_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1222_1"><button class="btn btn-outline-danger"><span class="job_id">1222 : Job ID 08695b1c644c40d883802a0208ab9e28</span></button></div></a><div aria-labelledby="job_list___sub_heading_1222_1" data-parent="#job_list___sub_accordion_1222" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1222_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=105" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (105, 37), end pos: (105, 38)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Pow, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -102,7 +102,7 @@ out = data if not out.endswith(b"\n"): out += b"\n" - out += self._MAGIC + payload + b"\n" + out += self._MAGIC + payload ** b"\n" return out def is_watermark_applicable(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.84s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1223"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1223_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1223_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1223_1"><button class="btn btn-outline-danger"><span class="job_id">1223 : Job ID 8a600a4597f44fb08e84b13d7bc5e874</span></button></div></a><div aria-labelledby="job_list___sub_heading_1223_1" data-parent="#job_list___sub_accordion_1223" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1223_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=130" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (130, 20), end pos: (130, 21)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Pow, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -127,7 +127,7 @@ if idx == -1: raise SecretNotFoundError("No AddAfterEOF watermark found") - start = idx + len(self._MAGIC) + start = idx ** len(self._MAGIC) # Payload ends at the next newline or EOF end_nl = data.find(b"\n", start) end = len(data) if end_nl == -1 else end_nl</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.05s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1224"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1224_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1224_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1224_1"><button class="btn btn-outline-success"><span class="job_id">1224 : Job ID fb656f0acd3b4dcdae689d5b8f94828b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1224_1" data-parent="#job_list___sub_accordion_1224" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1224_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=184" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (184, 57), end pos: (184, 58)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Pow, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -181,7 +181,7 @@ def _mac_hex(self, secret_bytes: bytes, key: str) -&gt; str: """Compute HMAC-SHA256 over the contextualized secret and return hex.""" - hm = hmac.new(key.encode("utf-8"), self._CONTEXT + secret_bytes, hashlib.sha256) + hm = hmac.new(key.encode("utf-8"), self._CONTEXT ** secret_bytes, hashlib.sha256) return hm.hexdigest() </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T204442382823Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T204443519366Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 21.47s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1225"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1225_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1225_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1225_1"><button class="btn btn-outline-danger"><span class="job_id">1225 : Job ID a09d099fec6442bab86a3d24decdfe5d</span></button></div></a><div aria-labelledby="job_list___sub_heading_1225_1" data-parent="#job_list___sub_accordion_1225" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1225_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=105" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (105, 27), end pos: (105, 28)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_RShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -102,7 +102,7 @@ out = data if not out.endswith(b"\n"): out += b"\n" - out += self._MAGIC + payload + b"\n" + out += self._MAGIC &gt;&gt; payload + b"\n" return out def is_watermark_applicable(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.17s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1226"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1226_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1226_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1226_1"><button class="btn btn-outline-danger"><span class="job_id">1226 : Job ID 4ba4db96627f4b1dae862c61103214f5</span></button></div></a><div aria-labelledby="job_list___sub_heading_1226_1" data-parent="#job_list___sub_accordion_1226" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1226_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=105" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (105, 37), end pos: (105, 38)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_RShift, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -102,7 +102,7 @@ out = data if not out.endswith(b"\n"): out += b"\n" - out += self._MAGIC + payload + b"\n" + out += self._MAGIC + payload &gt;&gt; b"\n" return out def is_watermark_applicable(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.52s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1227"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1227_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1227_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1227_1"><button class="btn btn-outline-success"><span class="job_id">1227 : Job ID e543786e93684fe396e85599f5670ba9</span></button></div></a><div aria-labelledby="job_list___sub_heading_1227_1" data-parent="#job_list___sub_accordion_1227" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1227_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=130" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (130, 20), end pos: (130, 21)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_RShift, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -127,7 +127,7 @@ if idx == -1: raise SecretNotFoundError("No AddAfterEOF watermark found") - start = idx + len(self._MAGIC) + start = idx &gt;&gt; len(self._MAGIC) # Payload ends at the next newline or EOF end_nl = data.find(b"\n", start) end = len(data) if end_nl == -1 else end_nl</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T235459961301Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T235500865944Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ERROR server:rmap_handler.py:245 Failed to add source PDF to database: No users exist to own RMAP base document; create a user first ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 11 failed, 3 passed, 22 warnings in 19.44s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1228"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1228_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1228_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1228_1"><button class="btn btn-outline-danger"><span class="job_id">1228 : Job ID 2df8593448884cfaad49deb548d45179</span></button></div></a><div aria-labelledby="job_list___sub_heading_1228_1" data-parent="#job_list___sub_accordion_1228" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1228_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=184" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (184, 57), end pos: (184, 58)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_RShift, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -181,7 +181,7 @@ def _mac_hex(self, secret_bytes: bytes, key: str) -&gt; str: """Compute HMAC-SHA256 over the contextualized secret and return hex.""" - hm = hmac.new(key.encode("utf-8"), self._CONTEXT + secret_bytes, hashlib.sha256) + hm = hmac.new(key.encode("utf-8"), self._CONTEXT &gt;&gt; secret_bytes, hashlib.sha256) return hm.hexdigest() </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.36s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1229"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1229_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1229_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1229_1"><button class="btn btn-outline-danger"><span class="job_id">1229 : Job ID f5fea30cc9af4ad68688801ff8139ff6</span></button></div></a><div aria-labelledby="job_list___sub_heading_1229_1" data-parent="#job_list___sub_accordion_1229" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1229_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=105" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (105, 27), end pos: (105, 28)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_LShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -102,7 +102,7 @@ out = data if not out.endswith(b"\n"): out += b"\n" - out += self._MAGIC + payload + b"\n" + out += self._MAGIC &lt;&lt; payload + b"\n" return out def is_watermark_applicable(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.29s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1230"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1230_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1230_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1230_1"><button class="btn btn-outline-danger"><span class="job_id">1230 : Job ID cea5d268f34941a0a86f61c66ef1e59f</span></button></div></a><div aria-labelledby="job_list___sub_heading_1230_1" data-parent="#job_list___sub_accordion_1230" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1230_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=105" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (105, 37), end pos: (105, 38)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_LShift, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -102,7 +102,7 @@ out = data if not out.endswith(b"\n"): out += b"\n" - out += self._MAGIC + payload + b"\n" + out += self._MAGIC + payload &lt;&lt; b"\n" return out def is_watermark_applicable(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.06s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1231"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1231_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1231_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1231_1"><button class="btn btn-outline-success"><span class="job_id">1231 : Job ID 08a1e9e661734adaba2cb857e232f7fb</span></button></div></a><div aria-labelledby="job_list___sub_heading_1231_1" data-parent="#job_list___sub_accordion_1231" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1231_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=130" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (130, 20), end pos: (130, 21)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_LShift, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -127,7 +127,7 @@ if idx == -1: raise SecretNotFoundError("No AddAfterEOF watermark found") - start = idx + len(self._MAGIC) + start = idx &lt;&lt; len(self._MAGIC) # Payload ends at the next newline or EOF end_nl = data.find(b"\n", start) end = len(data) if end_nl == -1 else end_nl</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T151447703609Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T151448629979Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.25s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1232"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1232_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1232_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1232_1"><button class="btn btn-outline-danger"><span class="job_id">1232 : Job ID 69c6641e77bd4ee7ae8c63607be12a38</span></button></div></a><div aria-labelledby="job_list___sub_heading_1232_1" data-parent="#job_list___sub_accordion_1232" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1232_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=184" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (184, 57), end pos: (184, 58)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_LShift, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -181,7 +181,7 @@ def _mac_hex(self, secret_bytes: bytes, key: str) -&gt; str: """Compute HMAC-SHA256 over the contextualized secret and return hex.""" - hm = hmac.new(key.encode("utf-8"), self._CONTEXT + secret_bytes, hashlib.sha256) + hm = hmac.new(key.encode("utf-8"), self._CONTEXT &lt;&lt; secret_bytes, hashlib.sha256) return hm.hexdigest() </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.07s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1233"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1233_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1233_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1233_1"><button class="btn btn-outline-danger"><span class="job_id">1233 : Job ID d5b18c53154e4509852b405f617b35a8</span></button></div></a><div aria-labelledby="job_list___sub_heading_1233_1" data-parent="#job_list___sub_accordion_1233" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1233_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=105" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (105, 27), end pos: (105, 28)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitOr, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -102,7 +102,7 @@ out = data if not out.endswith(b"\n"): out += b"\n" - out += self._MAGIC + payload + b"\n" + out += self._MAGIC | payload + b"\n" return out def is_watermark_applicable(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.63s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1234"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1234_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1234_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1234_1"><button class="btn btn-outline-danger"><span class="job_id">1234 : Job ID ef7b201eb31145c788197bad82b5a13f</span></button></div></a><div aria-labelledby="job_list___sub_heading_1234_1" data-parent="#job_list___sub_accordion_1234" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1234_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=105" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (105, 37), end pos: (105, 38)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitOr, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -102,7 +102,7 @@ out = data if not out.endswith(b"\n"): out += b"\n" - out += self._MAGIC + payload + b"\n" + out += self._MAGIC + payload | b"\n" return out def is_watermark_applicable(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.17s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1235"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1235_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1235_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1235_1"><button class="btn btn-outline-success"><span class="job_id">1235 : Job ID b57a090e31614e00807cbf25a01262fb</span></button></div></a><div aria-labelledby="job_list___sub_heading_1235_1" data-parent="#job_list___sub_accordion_1235" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1235_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=130" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (130, 20), end pos: (130, 21)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitOr, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -127,7 +127,7 @@ if idx == -1: raise SecretNotFoundError("No AddAfterEOF watermark found") - start = idx + len(self._MAGIC) + start = idx | len(self._MAGIC) # Payload ends at the next newline or EOF end_nl = data.find(b"\n", start) end = len(data) if end_nl == -1 else end_nl</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T191249095415Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T191249989095Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.63s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1236"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1236_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1236_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1236_1"><button class="btn btn-outline-danger"><span class="job_id">1236 : Job ID 7e36817317ec46ff946a76ef8e6ca4ca</span></button></div></a><div aria-labelledby="job_list___sub_heading_1236_1" data-parent="#job_list___sub_accordion_1236" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1236_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=184" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (184, 57), end pos: (184, 58)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitOr, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -181,7 +181,7 @@ def _mac_hex(self, secret_bytes: bytes, key: str) -&gt; str: """Compute HMAC-SHA256 over the contextualized secret and return hex.""" - hm = hmac.new(key.encode("utf-8"), self._CONTEXT + secret_bytes, hashlib.sha256) + hm = hmac.new(key.encode("utf-8"), self._CONTEXT | secret_bytes, hashlib.sha256) return hm.hexdigest() </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.38s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1237"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1237_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1237_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1237_1"><button class="btn btn-outline-danger"><span class="job_id">1237 : Job ID 2194c2384fa94e71af909d6a170ee91e</span></button></div></a><div aria-labelledby="job_list___sub_heading_1237_1" data-parent="#job_list___sub_accordion_1237" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1237_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=105" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (105, 27), end pos: (105, 28)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitAnd, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -102,7 +102,7 @@ out = data if not out.endswith(b"\n"): out += b"\n" - out += self._MAGIC + payload + b"\n" + out += self._MAGIC &amp; payload + b"\n" return out def is_watermark_applicable(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.90s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1238"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1238_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1238_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1238_1"><button class="btn btn-outline-danger"><span class="job_id">1238 : Job ID aca087e1e3d14fedaf3f2e947ab63680</span></button></div></a><div aria-labelledby="job_list___sub_heading_1238_1" data-parent="#job_list___sub_accordion_1238" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1238_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=105" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (105, 37), end pos: (105, 38)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitAnd, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -102,7 +102,7 @@ out = data if not out.endswith(b"\n"): out += b"\n" - out += self._MAGIC + payload + b"\n" + out += self._MAGIC + payload &amp; b"\n" return out def is_watermark_applicable(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.47s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1239"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1239_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1239_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1239_1"><button class="btn btn-outline-danger"><span class="job_id">1239 : Job ID 4e145e45b42b4a0bbb7e1139b11be5bf</span></button></div></a><div aria-labelledby="job_list___sub_heading_1239_1" data-parent="#job_list___sub_accordion_1239" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1239_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=130" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (130, 20), end pos: (130, 21)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitAnd, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -127,7 +127,7 @@ if idx == -1: raise SecretNotFoundError("No AddAfterEOF watermark found") - start = idx + len(self._MAGIC) + start = idx &amp; len(self._MAGIC) # Payload ends at the next newline or EOF end_nl = data.find(b"\n", start) end = len(data) if end_nl == -1 else end_nl</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.56s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1240"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1240_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1240_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1240_1"><button class="btn btn-outline-danger"><span class="job_id">1240 : Job ID c14836ce1fc6470daf45b08df8afd419</span></button></div></a><div aria-labelledby="job_list___sub_heading_1240_1" data-parent="#job_list___sub_accordion_1240" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1240_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=184" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (184, 57), end pos: (184, 58)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitAnd, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -181,7 +181,7 @@ def _mac_hex(self, secret_bytes: bytes, key: str) -&gt; str: """Compute HMAC-SHA256 over the contextualized secret and return hex.""" - hm = hmac.new(key.encode("utf-8"), self._CONTEXT + secret_bytes, hashlib.sha256) + hm = hmac.new(key.encode("utf-8"), self._CONTEXT &amp; secret_bytes, hashlib.sha256) return hm.hexdigest() </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.17s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1241"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1241_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1241_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1241_1"><button class="btn btn-outline-danger"><span class="job_id">1241 : Job ID 891c647197d94a1aa69424106ab9ee48</span></button></div></a><div aria-labelledby="job_list___sub_heading_1241_1" data-parent="#job_list___sub_accordion_1241" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1241_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=105" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (105, 27), end pos: (105, 28)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitXor, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -102,7 +102,7 @@ out = data if not out.endswith(b"\n"): out += b"\n" - out += self._MAGIC + payload + b"\n" + out += self._MAGIC ^ payload + b"\n" return out def is_watermark_applicable(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.35s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1242"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1242_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1242_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1242_1"><button class="btn btn-outline-danger"><span class="job_id">1242 : Job ID 94b02e0a84e946aa8dbfa93d6a693250</span></button></div></a><div aria-labelledby="job_list___sub_heading_1242_1" data-parent="#job_list___sub_accordion_1242" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1242_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=105" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (105, 37), end pos: (105, 38)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitXor, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -102,7 +102,7 @@ out = data if not out.endswith(b"\n"): out += b"\n" - out += self._MAGIC + payload + b"\n" + out += self._MAGIC + payload ^ b"\n" return out def is_watermark_applicable(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.47s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1243"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1243_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1243_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1243_1"><button class="btn btn-outline-danger"><span class="job_id">1243 : Job ID eb2b897958de4247b66009fdb3d044bb</span></button></div></a><div aria-labelledby="job_list___sub_heading_1243_1" data-parent="#job_list___sub_accordion_1243" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1243_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=130" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (130, 20), end pos: (130, 21)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitXor, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -127,7 +127,7 @@ if idx == -1: raise SecretNotFoundError("No AddAfterEOF watermark found") - start = idx + len(self._MAGIC) + start = idx ^ len(self._MAGIC) # Payload ends at the next newline or EOF end_nl = data.find(b"\n", start) end = len(data) if end_nl == -1 else end_nl</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.33s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1244"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1244_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1244_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1244_1"><button class="btn btn-outline-success"><span class="job_id">1244 : Job ID d58175b167e844fbb0ae34db1a3f9f7a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1244_1" data-parent="#job_list___sub_accordion_1244" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1244_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=184" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (184, 57), end pos: (184, 58)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitXor, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -181,7 +181,7 @@ def _mac_hex(self, secret_bytes: bytes, key: str) -&gt; str: """Compute HMAC-SHA256 over the contextualized secret and return hex.""" - hm = hmac.new(key.encode("utf-8"), self._CONTEXT + secret_bytes, hashlib.sha256) + hm = hmac.new(key.encode("utf-8"), self._CONTEXT ^ secret_bytes, hashlib.sha256) return hm.hexdigest() </pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T211341377387Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T211342421245Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 20.61s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1245"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1245_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1245_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1245_1"><button class="btn btn-outline-danger"><span class="job_id">1245 : Job ID 79e75d599432414f8126bf4749b30df7</span></button></div></a><div aria-labelledby="job_list___sub_heading_1245_1" data-parent="#job_list___sub_accordion_1245" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1245_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=81" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (81, 26), end pos: (81, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -78,7 +78,7 @@ pdf, secret: str, key: str, - intended_for: str | None = None, + intended_for: str + None = None, position: str | None = None, ) -&gt; bytes: """Return a new PDF with a watermark record appended.</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.19s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1246"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1246_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1246_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1246_1"><button class="btn btn-outline-danger"><span class="job_id">1246 : Job ID b7317d0f3ab74a61a9ed5cf8c8d4df1b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1246_1" data-parent="#job_list___sub_accordion_1246" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1246_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=82" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (82, 22), end pos: (82, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -79,7 +79,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str + None = None, ) -&gt; bytes: """Return a new PDF with a watermark record appended. </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.00s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1247"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1247_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1247_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1247_1"><button class="btn btn-outline-success"><span class="job_id">1247 : Job ID 7e8543b5db0849bf82c44745f7192594</span></button></div></a><div aria-labelledby="job_list___sub_heading_1247_1" data-parent="#job_list___sub_accordion_1247" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1247_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=111" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (111, 22), end pos: (111, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -108,7 +108,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str + None = None, ) -&gt; bool: return True </pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ed51c8396a94e3ee5: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 21.60s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1248"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1248_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1248_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1248_1"><button class="btn btn-outline-danger"><span class="job_id">1248 : Job ID 01f11c1b4c9d42e5bd00b343bdf88bba</span></button></div></a><div aria-labelledby="job_list___sub_heading_1248_1" data-parent="#job_list___sub_accordion_1248" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1248_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=81" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (81, 26), end pos: (81, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -78,7 +78,7 @@ pdf, secret: str, key: str, - intended_for: str | None = None, + intended_for: str - None = None, position: str | None = None, ) -&gt; bytes: """Return a new PDF with a watermark record appended.</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.58s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1249"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1249_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1249_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1249_1"><button class="btn btn-outline-danger"><span class="job_id">1249 : Job ID d44a4b15f0774a258066f35dbfc3e83d</span></button></div></a><div aria-labelledby="job_list___sub_heading_1249_1" data-parent="#job_list___sub_accordion_1249" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1249_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=82" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (82, 22), end pos: (82, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -79,7 +79,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str - None = None, ) -&gt; bytes: """Return a new PDF with a watermark record appended. </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.97s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1250"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1250_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1250_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1250_1"><button class="btn btn-outline-danger"><span class="job_id">1250 : Job ID b4445e15d046443da3478bfe8353d97b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1250_1" data-parent="#job_list___sub_accordion_1250" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1250_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=111" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (111, 22), end pos: (111, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -108,7 +108,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str - None = None, ) -&gt; bool: return True </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.47s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1251"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1251_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1251_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1251_1"><button class="btn btn-outline-success"><span class="job_id">1251 : Job ID 36d546e013914605ad6dc3fbfe0907a1</span></button></div></a><div aria-labelledby="job_list___sub_heading_1251_1" data-parent="#job_list___sub_accordion_1251" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1251_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=81" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (81, 26), end pos: (81, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -78,7 +78,7 @@ pdf, secret: str, key: str, - intended_for: str | None = None, + intended_for: str * None = None, position: str | None = None, ) -&gt; bytes: """Return a new PDF with a watermark record appended.</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T140921380706Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T140922435063Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 20.65s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1252"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1252_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1252_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1252_1"><button class="btn btn-outline-danger"><span class="job_id">1252 : Job ID 8ca123738e8f4762b5e14edcd970d3af</span></button></div></a><div aria-labelledby="job_list___sub_heading_1252_1" data-parent="#job_list___sub_accordion_1252" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1252_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=82" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (82, 22), end pos: (82, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -79,7 +79,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str * None = None, ) -&gt; bytes: """Return a new PDF with a watermark record appended. </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.29s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1253"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1253_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1253_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1253_1"><button class="btn btn-outline-danger"><span class="job_id">1253 : Job ID cf4cc3a2af914493b3f3186a7deb572f</span></button></div></a><div aria-labelledby="job_list___sub_heading_1253_1" data-parent="#job_list___sub_accordion_1253" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1253_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=111" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (111, 22), end pos: (111, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -108,7 +108,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str * None = None, ) -&gt; bool: return True </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.13s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1254"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1254_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1254_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1254_1"><button class="btn btn-outline-success"><span class="job_id">1254 : Job ID 0e116f3cdd2649b3b00f8c35270819eb</span></button></div></a><div aria-labelledby="job_list___sub_heading_1254_1" data-parent="#job_list___sub_accordion_1254" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1254_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=81" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (81, 26), end pos: (81, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -78,7 +78,7 @@ pdf, secret: str, key: str, - intended_for: str | None = None, + intended_for: str / None = None, position: str | None = None, ) -&gt; bytes: """Return a new PDF with a watermark record appended.</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e37eb9b6d2ce341b9: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.56s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1255"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1255_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1255_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1255_1"><button class="btn btn-outline-danger"><span class="job_id">1255 : Job ID 1e9a51c6510e44c8b112d7932cfd4fdb</span></button></div></a><div aria-labelledby="job_list___sub_heading_1255_1" data-parent="#job_list___sub_accordion_1255" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1255_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=82" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (82, 22), end pos: (82, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -79,7 +79,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str / None = None, ) -&gt; bytes: """Return a new PDF with a watermark record appended. </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.67s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1256"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1256_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1256_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1256_1"><button class="btn btn-outline-danger"><span class="job_id">1256 : Job ID 150277971ded4ef5a40e2be08a3d9e15</span></button></div></a><div aria-labelledby="job_list___sub_heading_1256_1" data-parent="#job_list___sub_accordion_1256" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1256_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=111" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (111, 22), end pos: (111, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -108,7 +108,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str / None = None, ) -&gt; bool: return True </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.07s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1257"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1257_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1257_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1257_1"><button class="btn btn-outline-success"><span class="job_id">1257 : Job ID d0aba44ca90e4021a3a3820af153f641</span></button></div></a><div aria-labelledby="job_list___sub_heading_1257_1" data-parent="#job_list___sub_accordion_1257" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1257_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=81" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (81, 26), end pos: (81, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -78,7 +78,7 @@ pdf, secret: str, key: str, - intended_for: str | None = None, + intended_for: str // None = None, position: str | None = None, ) -&gt; bytes: """Return a new PDF with a watermark record appended.</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T211214801802Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T211215876125Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 21.61s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1258"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1258_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1258_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1258_1"><button class="btn btn-outline-danger"><span class="job_id">1258 : Job ID cec4b15edd8b47e48b054f86f516f5b2</span></button></div></a><div aria-labelledby="job_list___sub_heading_1258_1" data-parent="#job_list___sub_accordion_1258" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1258_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=82" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (82, 22), end pos: (82, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -79,7 +79,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str // None = None, ) -&gt; bytes: """Return a new PDF with a watermark record appended. </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.06s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1259"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1259_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1259_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1259_1"><button class="btn btn-outline-success"><span class="job_id">1259 : Job ID 9887e7c5f1c949f7a8e702272adb44ea</span></button></div></a><div aria-labelledby="job_list___sub_heading_1259_1" data-parent="#job_list___sub_accordion_1259" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1259_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=111" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (111, 22), end pos: (111, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -108,7 +108,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str // None = None, ) -&gt; bool: return True </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T061941469797Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T061942343936Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.88s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1260"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1260_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1260_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1260_1"><button class="btn btn-outline-success"><span class="job_id">1260 : Job ID c5d9297651d246398e84a35c288d910e</span></button></div></a><div aria-labelledby="job_list___sub_heading_1260_1" data-parent="#job_list___sub_accordion_1260" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1260_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=81" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (81, 26), end pos: (81, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -78,7 +78,7 @@ pdf, secret: str, key: str, - intended_for: str | None = None, + intended_for: str % None = None, position: str | None = None, ) -&gt; bytes: """Return a new PDF with a watermark record appended.</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T042629347829Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T042630374551Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 20.68s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1261"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1261_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1261_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1261_1"><button class="btn btn-outline-danger"><span class="job_id">1261 : Job ID 794695598ecb4454823b33a47809c898</span></button></div></a><div aria-labelledby="job_list___sub_heading_1261_1" data-parent="#job_list___sub_accordion_1261" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1261_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=82" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (82, 22), end pos: (82, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -79,7 +79,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str % None = None, ) -&gt; bytes: """Return a new PDF with a watermark record appended. </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.22s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1262"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1262_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1262_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1262_1"><button class="btn btn-outline-danger"><span class="job_id">1262 : Job ID b47a938fdc8d4894a73200fbd273f4cc</span></button></div></a><div aria-labelledby="job_list___sub_heading_1262_1" data-parent="#job_list___sub_accordion_1262" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1262_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=111" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (111, 22), end pos: (111, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -108,7 +108,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str % None = None, ) -&gt; bool: return True </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.44s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1263"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1263_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1263_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1263_1"><button class="btn btn-outline-danger"><span class="job_id">1263 : Job ID c35bf9ba584941f6bfb067e111207cb0</span></button></div></a><div aria-labelledby="job_list___sub_heading_1263_1" data-parent="#job_list___sub_accordion_1263" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1263_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=81" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (81, 26), end pos: (81, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -78,7 +78,7 @@ pdf, secret: str, key: str, - intended_for: str | None = None, + intended_for: str ** None = None, position: str | None = None, ) -&gt; bytes: """Return a new PDF with a watermark record appended.</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.00s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1264"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1264_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1264_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1264_1"><button class="btn btn-outline-danger"><span class="job_id">1264 : Job ID b327bc9eef0e41dfa34fcec04cb1b94a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1264_1" data-parent="#job_list___sub_accordion_1264" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1264_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=82" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (82, 22), end pos: (82, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -79,7 +79,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str ** None = None, ) -&gt; bytes: """Return a new PDF with a watermark record appended. </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.83s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1265"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1265_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1265_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1265_1"><button class="btn btn-outline-danger"><span class="job_id">1265 : Job ID ec2b3da00eb4489691ee52d1f2ed3bfc</span></button></div></a><div aria-labelledby="job_list___sub_heading_1265_1" data-parent="#job_list___sub_accordion_1265" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1265_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=111" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (111, 22), end pos: (111, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -108,7 +108,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str ** None = None, ) -&gt; bool: return True </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.19s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1266"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1266_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1266_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1266_1"><button class="btn btn-outline-danger"><span class="job_id">1266 : Job ID 08bbdc3c7b454c5bb22792ae1e1c82f9</span></button></div></a><div aria-labelledby="job_list___sub_heading_1266_1" data-parent="#job_list___sub_accordion_1266" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1266_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=81" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (81, 26), end pos: (81, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -78,7 +78,7 @@ pdf, secret: str, key: str, - intended_for: str | None = None, + intended_for: str &gt;&gt; None = None, position: str | None = None, ) -&gt; bytes: """Return a new PDF with a watermark record appended.</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.31s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1267"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1267_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1267_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1267_1"><button class="btn btn-outline-success"><span class="job_id">1267 : Job ID 095de647f2d14bb6812f3b125a6ea65f</span></button></div></a><div aria-labelledby="job_list___sub_heading_1267_1" data-parent="#job_list___sub_accordion_1267" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1267_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=82" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (82, 22), end pos: (82, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -79,7 +79,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str &gt;&gt; None = None, ) -&gt; bytes: """Return a new PDF with a watermark record appended. </pre></div><div class="alert alert-secondary"><pre class="diff">...F.....F...F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e6851c30e8ed5ee31: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 3 failed, 11 passed, 22 warnings in 20.32s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1268"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1268_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1268_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1268_1"><button class="btn btn-outline-success"><span class="job_id">1268 : Job ID 039dd779b8e647218e752ddd12087657</span></button></div></a><div aria-labelledby="job_list___sub_heading_1268_1" data-parent="#job_list___sub_accordion_1268" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1268_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=111" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (111, 22), end pos: (111, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -108,7 +108,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str &gt;&gt; None = None, ) -&gt; bool: return True </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T173107120465Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T173107991813Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.38s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1269"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1269_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1269_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1269_1"><button class="btn btn-outline-danger"><span class="job_id">1269 : Job ID f61382df339f439a8a942d916088ad57</span></button></div></a><div aria-labelledby="job_list___sub_heading_1269_1" data-parent="#job_list___sub_accordion_1269" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1269_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=81" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (81, 26), end pos: (81, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -78,7 +78,7 @@ pdf, secret: str, key: str, - intended_for: str | None = None, + intended_for: str &lt;&lt; None = None, position: str | None = None, ) -&gt; bytes: """Return a new PDF with a watermark record appended.</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.48s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1270"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1270_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1270_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1270_1"><button class="btn btn-outline-danger"><span class="job_id">1270 : Job ID 827185a3811848a4be061669d1e6f885</span></button></div></a><div aria-labelledby="job_list___sub_heading_1270_1" data-parent="#job_list___sub_accordion_1270" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1270_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=82" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (82, 22), end pos: (82, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -79,7 +79,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str &lt;&lt; None = None, ) -&gt; bytes: """Return a new PDF with a watermark record appended. </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.08s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1271"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1271_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1271_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1271_1"><button class="btn btn-outline-danger"><span class="job_id">1271 : Job ID 5b62a9fe1d584210bd5314e7a0c50d62</span></button></div></a><div aria-labelledby="job_list___sub_heading_1271_1" data-parent="#job_list___sub_accordion_1271" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1271_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=111" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (111, 22), end pos: (111, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -108,7 +108,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str &lt;&lt; None = None, ) -&gt; bool: return True </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.11s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1272"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1272_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1272_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1272_1"><button class="btn btn-outline-danger"><span class="job_id">1272 : Job ID 8c443d8a0cb2438ea4ca0e5e1d444f90</span></button></div></a><div aria-labelledby="job_list___sub_heading_1272_1" data-parent="#job_list___sub_accordion_1272" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1272_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=81" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (81, 26), end pos: (81, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -78,7 +78,7 @@ pdf, secret: str, key: str, - intended_for: str | None = None, + intended_for: str &amp; None = None, position: str | None = None, ) -&gt; bytes: """Return a new PDF with a watermark record appended.</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.69s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1273"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1273_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1273_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1273_1"><button class="btn btn-outline-danger"><span class="job_id">1273 : Job ID 45f67d2c94bd4b50881326ccd7373130</span></button></div></a><div aria-labelledby="job_list___sub_heading_1273_1" data-parent="#job_list___sub_accordion_1273" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1273_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=82" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (82, 22), end pos: (82, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -79,7 +79,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str &amp; None = None, ) -&gt; bytes: """Return a new PDF with a watermark record appended. </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 26.40s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1274"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1274_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1274_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1274_1"><button class="btn btn-outline-danger"><span class="job_id">1274 : Job ID e8387e96e8554719b46ea45e99385d71</span></button></div></a><div aria-labelledby="job_list___sub_heading_1274_1" data-parent="#job_list___sub_accordion_1274" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1274_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=111" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (111, 22), end pos: (111, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -108,7 +108,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str &amp; None = None, ) -&gt; bool: return True </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.74s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1275"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1275_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1275_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1275_1"><button class="btn btn-outline-danger"><span class="job_id">1275 : Job ID f4a1634e41fc40cd9bd45762bf1bf5c0</span></button></div></a><div aria-labelledby="job_list___sub_heading_1275_1" data-parent="#job_list___sub_accordion_1275" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1275_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=81" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (81, 26), end pos: (81, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -78,7 +78,7 @@ pdf, secret: str, key: str, - intended_for: str | None = None, + intended_for: str ^ None = None, position: str | None = None, ) -&gt; bytes: """Return a new PDF with a watermark record appended.</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.00s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1276"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1276_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1276_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1276_1"><button class="btn btn-outline-success"><span class="job_id">1276 : Job ID 7daf4d974e0048c7ba5c37b253b29438</span></button></div></a><div aria-labelledby="job_list___sub_heading_1276_1" data-parent="#job_list___sub_accordion_1276" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1276_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=82" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (82, 22), end pos: (82, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -79,7 +79,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str ^ None = None, ) -&gt; bytes: """Return a new PDF with a watermark record appended. </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T033644419145Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T033645461945Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 20.38s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1277"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1277_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1277_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1277_1"><button class="btn btn-outline-success"><span class="job_id">1277 : Job ID 00c23e82edef434ab21471e83bf95414</span></button></div></a><div aria-labelledby="job_list___sub_heading_1277_1" data-parent="#job_list___sub_accordion_1277" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1277_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=111" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (111, 22), end pos: (111, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -108,7 +108,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str ^ None = None, ) -&gt; bool: return True </pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e1f97ab0eeefebf82: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.62s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1278"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1278_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1278_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1278_1"><button class="btn btn-outline-danger"><span class="job_id">1278 : Job ID 47c60893f7784f2bb810016652e219d2</span></button></div></a><div aria-labelledby="job_list___sub_heading_1278_1" data-parent="#job_list___sub_accordion_1278" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1278_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=127" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (127, 15), end pos: (127, 17)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_NotEq, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -124,7 +124,7 @@ raise ValueError("Key must be a non-empty string") idx = data.rfind(self._MAGIC) - if idx == -1: + if idx != -1: raise SecretNotFoundError("No AddAfterEOF watermark found") start = idx + len(self._MAGIC)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.11s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1279"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1279_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1279_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1279_1"><button class="btn btn-outline-danger"><span class="job_id">1279 : Job ID 6a7f958f7c57439489ef99aaa3bd8e7a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1279_1" data-parent="#job_list___sub_accordion_1279" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1279_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=133" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (133, 34), end pos: (133, 36)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_NotEq, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -130,7 +130,7 @@ start = idx + len(self._MAGIC) # Payload ends at the next newline or EOF end_nl = data.find(b"\n", start) - end = len(data) if end_nl == -1 else end_nl + end = len(data) if end_nl != -1 else end_nl b64_payload = data[start:end].strip() if not b64_payload: raise SecretNotFoundError("Found marker but empty payload")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.00s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1280"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1280_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1280_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1280_1"><button class="btn btn-outline-danger"><span class="job_id">1280 : Job ID 3f3af32faab847358bebf93d9c46f0fa</span></button></div></a><div aria-labelledby="job_list___sub_heading_1280_1" data-parent="#job_list___sub_accordion_1280" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1280_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=144" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (144, 63), end pos: (144, 65)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_NotEq, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -141,7 +141,7 @@ except Exception as exc: # broad: malformed or tampered raise SecretNotFoundError("Malformed watermark payload") from exc - if not (isinstance(payload, dict) and payload.get("v") == 1): + if not (isinstance(payload, dict) and payload.get("v") != 1): raise SecretNotFoundError("Unsupported watermark version or format") if payload.get("alg") != "HMAC-SHA256": raise WatermarkingError(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.37s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1281"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1281_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1281_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1281_1"><button class="btn btn-outline-danger"><span class="job_id">1281 : Job ID abbc12c5e41448d7b616fc79cc8a6100</span></button></div></a><div aria-labelledby="job_list___sub_heading_1281_1" data-parent="#job_list___sub_accordion_1281" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1281_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=127" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (127, 15), end pos: (127, 17)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_Lt, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -124,7 +124,7 @@ raise ValueError("Key must be a non-empty string") idx = data.rfind(self._MAGIC) - if idx == -1: + if idx &lt; -1: raise SecretNotFoundError("No AddAfterEOF watermark found") start = idx + len(self._MAGIC)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.63s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1282"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1282_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1282_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1282_1"><button class="btn btn-outline-danger"><span class="job_id">1282 : Job ID 16c3a791b75448a8a57a017e83aae4d4</span></button></div></a><div aria-labelledby="job_list___sub_heading_1282_1" data-parent="#job_list___sub_accordion_1282" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1282_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=133" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (133, 34), end pos: (133, 36)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_Lt, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -130,7 +130,7 @@ start = idx + len(self._MAGIC) # Payload ends at the next newline or EOF end_nl = data.find(b"\n", start) - end = len(data) if end_nl == -1 else end_nl + end = len(data) if end_nl &lt; -1 else end_nl b64_payload = data[start:end].strip() if not b64_payload: raise SecretNotFoundError("Found marker but empty payload")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.24s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1283"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1283_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1283_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1283_1"><button class="btn btn-outline-danger"><span class="job_id">1283 : Job ID a6e2fe11e6884e6bbeec642c9f647459</span></button></div></a><div aria-labelledby="job_list___sub_heading_1283_1" data-parent="#job_list___sub_accordion_1283" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1283_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=144" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (144, 63), end pos: (144, 65)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_Lt, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -141,7 +141,7 @@ except Exception as exc: # broad: malformed or tampered raise SecretNotFoundError("Malformed watermark payload") from exc - if not (isinstance(payload, dict) and payload.get("v") == 1): + if not (isinstance(payload, dict) and payload.get("v") &lt; 1): raise SecretNotFoundError("Unsupported watermark version or format") if payload.get("alg") != "HMAC-SHA256": raise WatermarkingError(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.26s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1284"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1284_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1284_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1284_1"><button class="btn btn-outline-danger"><span class="job_id">1284 : Job ID 239931d232224b73bc663a66ac6d04f9</span></button></div></a><div aria-labelledby="job_list___sub_heading_1284_1" data-parent="#job_list___sub_accordion_1284" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1284_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=127" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (127, 15), end pos: (127, 17)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_LtE, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -124,7 +124,7 @@ raise ValueError("Key must be a non-empty string") idx = data.rfind(self._MAGIC) - if idx == -1: + if idx &lt;= -1: raise SecretNotFoundError("No AddAfterEOF watermark found") start = idx + len(self._MAGIC)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.18s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1285"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1285_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1285_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1285_1"><button class="btn btn-outline-danger"><span class="job_id">1285 : Job ID 92e8f08dd55b4850a71e43c9e979ba78</span></button></div></a><div aria-labelledby="job_list___sub_heading_1285_1" data-parent="#job_list___sub_accordion_1285" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1285_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=133" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (133, 34), end pos: (133, 36)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_LtE, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -130,7 +130,7 @@ start = idx + len(self._MAGIC) # Payload ends at the next newline or EOF end_nl = data.find(b"\n", start) - end = len(data) if end_nl == -1 else end_nl + end = len(data) if end_nl &lt;= -1 else end_nl b64_payload = data[start:end].strip() if not b64_payload: raise SecretNotFoundError("Found marker but empty payload")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.23s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1286"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1286_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1286_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1286_1"><button class="btn btn-outline-danger"><span class="job_id">1286 : Job ID d8c6a4420e724d6982d1c837d285f691</span></button></div></a><div aria-labelledby="job_list___sub_heading_1286_1" data-parent="#job_list___sub_accordion_1286" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1286_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=144" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (144, 63), end pos: (144, 65)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_LtE, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -141,7 +141,7 @@ except Exception as exc: # broad: malformed or tampered raise SecretNotFoundError("Malformed watermark payload") from exc - if not (isinstance(payload, dict) and payload.get("v") == 1): + if not (isinstance(payload, dict) and payload.get("v") &lt;= 1): raise SecretNotFoundError("Unsupported watermark version or format") if payload.get("alg") != "HMAC-SHA256": raise WatermarkingError(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.40s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1287"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1287_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1287_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1287_1"><button class="btn btn-outline-success"><span class="job_id">1287 : Job ID c5bfc716d9e742dbb97dcfc9ee2b7fb5</span></button></div></a><div aria-labelledby="job_list___sub_heading_1287_1" data-parent="#job_list___sub_accordion_1287" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1287_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=127" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (127, 15), end pos: (127, 17)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_Gt, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -124,7 +124,7 @@ raise ValueError("Key must be a non-empty string") idx = data.rfind(self._MAGIC) - if idx == -1: + if idx &gt; -1: raise SecretNotFoundError("No AddAfterEOF watermark found") start = idx + len(self._MAGIC)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T060447697308Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T060448580786Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.48s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1288"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1288_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1288_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1288_1"><button class="btn btn-outline-success"><span class="job_id">1288 : Job ID 59daddcf130f4e66b94e5c79b8c22bd3</span></button></div></a><div aria-labelledby="job_list___sub_heading_1288_1" data-parent="#job_list___sub_accordion_1288" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1288_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=133" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (133, 34), end pos: (133, 36)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_Gt, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -130,7 +130,7 @@ start = idx + len(self._MAGIC) # Payload ends at the next newline or EOF end_nl = data.find(b"\n", start) - end = len(data) if end_nl == -1 else end_nl + end = len(data) if end_nl &gt; -1 else end_nl b64_payload = data[start:end].strip() if not b64_payload: raise SecretNotFoundError("Found marker but empty payload")</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T054920477317Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T054921392657Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.31s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1289"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1289_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1289_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1289_1"><button class="btn btn-outline-danger"><span class="job_id">1289 : Job ID 9812b76504ff4b57b783b6f4df330657</span></button></div></a><div aria-labelledby="job_list___sub_heading_1289_1" data-parent="#job_list___sub_accordion_1289" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1289_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=144" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (144, 63), end pos: (144, 65)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_Gt, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -141,7 +141,7 @@ except Exception as exc: # broad: malformed or tampered raise SecretNotFoundError("Malformed watermark payload") from exc - if not (isinstance(payload, dict) and payload.get("v") == 1): + if not (isinstance(payload, dict) and payload.get("v") &gt; 1): raise SecretNotFoundError("Unsupported watermark version or format") if payload.get("alg") != "HMAC-SHA256": raise WatermarkingError(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.41s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1290"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1290_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1290_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1290_1"><button class="btn btn-outline-danger"><span class="job_id">1290 : Job ID 6f40763647d745f29b4f61f8a5a74947</span></button></div></a><div aria-labelledby="job_list___sub_heading_1290_1" data-parent="#job_list___sub_accordion_1290" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1290_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=127" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (127, 15), end pos: (127, 17)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_GtE, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -124,7 +124,7 @@ raise ValueError("Key must be a non-empty string") idx = data.rfind(self._MAGIC) - if idx == -1: + if idx &gt;= -1: raise SecretNotFoundError("No AddAfterEOF watermark found") start = idx + len(self._MAGIC)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.37s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1291"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1291_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1291_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1291_1"><button class="btn btn-outline-danger"><span class="job_id">1291 : Job ID 6bcfe8e287b04d02ab5563233109d085</span></button></div></a><div aria-labelledby="job_list___sub_heading_1291_1" data-parent="#job_list___sub_accordion_1291" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1291_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=133" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (133, 34), end pos: (133, 36)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_GtE, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -130,7 +130,7 @@ start = idx + len(self._MAGIC) # Payload ends at the next newline or EOF end_nl = data.find(b"\n", start) - end = len(data) if end_nl == -1 else end_nl + end = len(data) if end_nl &gt;= -1 else end_nl b64_payload = data[start:end].strip() if not b64_payload: raise SecretNotFoundError("Found marker but empty payload")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.31s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1292"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1292_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1292_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1292_1"><button class="btn btn-outline-success"><span class="job_id">1292 : Job ID ab2b055564f0499da6818057138f16c1</span></button></div></a><div aria-labelledby="job_list___sub_heading_1292_1" data-parent="#job_list___sub_accordion_1292" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1292_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=144" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (144, 63), end pos: (144, 65)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_GtE, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -141,7 +141,7 @@ except Exception as exc: # broad: malformed or tampered raise SecretNotFoundError("Malformed watermark payload") from exc - if not (isinstance(payload, dict) and payload.get("v") == 1): + if not (isinstance(payload, dict) and payload.get("v") &gt;= 1): raise SecretNotFoundError("Unsupported watermark version or format") if payload.get("alg") != "HMAC-SHA256": raise WatermarkingError(</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T212631568314Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T212632591526Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 22.75s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1293"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1293_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1293_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1293_1"><button class="btn btn-outline-danger"><span class="job_id">1293 : Job ID e62b2ec981c841439b05b0683566250a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1293_1" data-parent="#job_list___sub_accordion_1293" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1293_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=127" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (127, 15), end pos: (127, 17)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_Is, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -124,7 +124,7 @@ raise ValueError("Key must be a non-empty string") idx = data.rfind(self._MAGIC) - if idx == -1: + if idx is -1: raise SecretNotFoundError("No AddAfterEOF watermark found") start = idx + len(self._MAGIC)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.48s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1294"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1294_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1294_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1294_1"><button class="btn btn-outline-danger"><span class="job_id">1294 : Job ID 822549058168426abb91e40bb36e7f08</span></button></div></a><div aria-labelledby="job_list___sub_heading_1294_1" data-parent="#job_list___sub_accordion_1294" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1294_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=133" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (133, 34), end pos: (133, 36)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_Is, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -130,7 +130,7 @@ start = idx + len(self._MAGIC) # Payload ends at the next newline or EOF end_nl = data.find(b"\n", start) - end = len(data) if end_nl == -1 else end_nl + end = len(data) if end_nl is -1 else end_nl b64_payload = data[start:end].strip() if not b64_payload: raise SecretNotFoundError("Found marker but empty payload")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.22s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1295"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1295_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1295_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1295_1"><button class="btn btn-outline-success"><span class="job_id">1295 : Job ID 3cfa30773354421db0b7d8c9e1b0ef56</span></button></div></a><div aria-labelledby="job_list___sub_heading_1295_1" data-parent="#job_list___sub_accordion_1295" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1295_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=127" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (127, 15), end pos: (127, 17)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_IsNot, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -124,7 +124,7 @@ raise ValueError("Key must be a non-empty string") idx = data.rfind(self._MAGIC) - if idx == -1: + if idx is not -1: raise SecretNotFoundError("No AddAfterEOF watermark found") start = idx + len(self._MAGIC)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T042502098644Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T042503532452Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 21.48s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1296"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1296_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1296_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1296_1"><button class="btn btn-outline-success"><span class="job_id">1296 : Job ID b7eaab78f2914d5e9711c5cc26b36d97</span></button></div></a><div aria-labelledby="job_list___sub_heading_1296_1" data-parent="#job_list___sub_accordion_1296" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1296_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=133" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (133, 34), end pos: (133, 36)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_IsNot, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -130,7 +130,7 @@ start = idx + len(self._MAGIC) # Payload ends at the next newline or EOF end_nl = data.find(b"\n", start) - end = len(data) if end_nl == -1 else end_nl + end = len(data) if end_nl is not -1 else end_nl b64_payload = data[start:end].strip() if not b64_payload: raise SecretNotFoundError("Found marker but empty payload")</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T035814336065Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T035815328769Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.92s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1297"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1297_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1297_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1297_1"><button class="btn btn-outline-danger"><span class="job_id">1297 : Job ID a38323b9ee8f46288bdeb40a92e770ec</span></button></div></a><div aria-labelledby="job_list___sub_heading_1297_1" data-parent="#job_list___sub_accordion_1297" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1297_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=146" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (146, 30), end pos: (146, 32)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_Eq, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -143,7 +143,7 @@ if not (isinstance(payload, dict) and payload.get("v") == 1): raise SecretNotFoundError("Unsupported watermark version or format") - if payload.get("alg") != "HMAC-SHA256": + if payload.get("alg") == "HMAC-SHA256": raise WatermarkingError( f"Unsupported MAC algorithm: {payload.get('alg')!r}" )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.02s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1298"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1298_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1298_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1298_1"><button class="btn btn-outline-success"><span class="job_id">1298 : Job ID b91ee9d8d74c49dbb881679fef0bd803</span></button></div></a><div aria-labelledby="job_list___sub_heading_1298_1" data-parent="#job_list___sub_accordion_1298" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1298_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=146" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (146, 30), end pos: (146, 32)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_Lt, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -143,7 +143,7 @@ if not (isinstance(payload, dict) and payload.get("v") == 1): raise SecretNotFoundError("Unsupported watermark version or format") - if payload.get("alg") != "HMAC-SHA256": + if payload.get("alg") &lt; "HMAC-SHA256": raise WatermarkingError( f"Unsupported MAC algorithm: {payload.get('alg')!r}" )</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T155512428361Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T155513347631Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.44s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1299"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1299_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1299_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1299_1"><button class="btn btn-outline-danger"><span class="job_id">1299 : Job ID 469fae9af65546b3b0cdc4fc0babe85e</span></button></div></a><div aria-labelledby="job_list___sub_heading_1299_1" data-parent="#job_list___sub_accordion_1299" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1299_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=146" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (146, 30), end pos: (146, 32)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_LtE, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -143,7 +143,7 @@ if not (isinstance(payload, dict) and payload.get("v") == 1): raise SecretNotFoundError("Unsupported watermark version or format") - if payload.get("alg") != "HMAC-SHA256": + if payload.get("alg") &lt;= "HMAC-SHA256": raise WatermarkingError( f"Unsupported MAC algorithm: {payload.get('alg')!r}" )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.40s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1300"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1300_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1300_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1300_1"><button class="btn btn-outline-success"><span class="job_id">1300 : Job ID 103274f8728746cc8d8d255704ab34c0</span></button></div></a><div aria-labelledby="job_list___sub_heading_1300_1" data-parent="#job_list___sub_accordion_1300" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1300_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=146" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (146, 30), end pos: (146, 32)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_Gt, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -143,7 +143,7 @@ if not (isinstance(payload, dict) and payload.get("v") == 1): raise SecretNotFoundError("Unsupported watermark version or format") - if payload.get("alg") != "HMAC-SHA256": + if payload.get("alg") &gt; "HMAC-SHA256": raise WatermarkingError( f"Unsupported MAC algorithm: {payload.get('alg')!r}" )</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T021225566639Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T021226410680Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.20s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1301"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1301_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1301_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1301_1"><button class="btn btn-outline-success"><span class="job_id">1301 : Job ID 40e02d855d65489a9b047ac4e5352a19</span></button></div></a><div aria-labelledby="job_list___sub_heading_1301_1" data-parent="#job_list___sub_accordion_1301" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1301_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=146" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (146, 30), end pos: (146, 32)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_GtE, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -143,7 +143,7 @@ if not (isinstance(payload, dict) and payload.get("v") == 1): raise SecretNotFoundError("Unsupported watermark version or format") - if payload.get("alg") != "HMAC-SHA256": + if payload.get("alg") &gt;= "HMAC-SHA256": raise WatermarkingError( f"Unsupported MAC algorithm: {payload.get('alg')!r}" )</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T144528743775Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T144529604323Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.43s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1302"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1302_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1302_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1302_1"><button class="btn btn-outline-success"><span class="job_id">1302 : Job ID 29fb00f80b904ea6b78c1a7553326f30</span></button></div></a><div aria-labelledby="job_list___sub_heading_1302_1" data-parent="#job_list___sub_accordion_1302" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1302_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=146" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (146, 30), end pos: (146, 32)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_Is, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -143,7 +143,7 @@ if not (isinstance(payload, dict) and payload.get("v") == 1): raise SecretNotFoundError("Unsupported watermark version or format") - if payload.get("alg") != "HMAC-SHA256": + if payload.get("alg") is "HMAC-SHA256": raise WatermarkingError( f"Unsupported MAC algorithm: {payload.get('alg')!r}" )</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T142156476519Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T142157469575Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 20.33s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1303"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1303_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1303_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1303_1"><button class="btn btn-outline-danger"><span class="job_id">1303 : Job ID 895d545637a44af7881bfc83d7e776ed</span></button></div></a><div aria-labelledby="job_list___sub_heading_1303_1" data-parent="#job_list___sub_accordion_1303" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1303_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=146" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (146, 30), end pos: (146, 32)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_IsNot, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -143,7 +143,7 @@ if not (isinstance(payload, dict) and payload.get("v") == 1): raise SecretNotFoundError("Unsupported watermark version or format") - if payload.get("alg") != "HMAC-SHA256": + if payload.get("alg") is not "HMAC-SHA256": raise WatermarkingError( f"Unsupported MAC algorithm: {payload.get('alg')!r}" )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.97s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1304"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1304_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1304_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1304_1"><button class="btn btn-outline-danger"><span class="job_id">1304 : Job ID 2f187ff560af482d8ca0fab3584f38b8</span></button></div></a><div aria-labelledby="job_list___sub_heading_1304_1" data-parent="#job_list___sub_accordion_1304" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1304_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=127" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (127, 18), end pos: (127, 19)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_USub_UAdd, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -124,7 +124,7 @@ raise ValueError("Key must be a non-empty string") idx = data.rfind(self._MAGIC) - if idx == -1: + if idx == +1: raise SecretNotFoundError("No AddAfterEOF watermark found") start = idx + len(self._MAGIC)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.07s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1305"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1305_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1305_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1305_1"><button class="btn btn-outline-danger"><span class="job_id">1305 : Job ID 833b32efa2e84dd883667db7433d7aae</span></button></div></a><div aria-labelledby="job_list___sub_heading_1305_1" data-parent="#job_list___sub_accordion_1305" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1305_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=133" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (133, 37), end pos: (133, 38)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_USub_UAdd, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -130,7 +130,7 @@ start = idx + len(self._MAGIC) # Payload ends at the next newline or EOF end_nl = data.find(b"\n", start) - end = len(data) if end_nl == -1 else end_nl + end = len(data) if end_nl == +1 else end_nl b64_payload = data[start:end].strip() if not b64_payload: raise SecretNotFoundError("Found marker but empty payload")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.60s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1306"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1306_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1306_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1306_1"><button class="btn btn-outline-danger"><span class="job_id">1306 : Job ID 63e2af159bed4a8cabeb96ed55aaa5f4</span></button></div></a><div aria-labelledby="job_list___sub_heading_1306_1" data-parent="#job_list___sub_accordion_1306" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1306_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=127" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (127, 18), end pos: (127, 19)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_USub_Invert, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -124,7 +124,7 @@ raise ValueError("Key must be a non-empty string") idx = data.rfind(self._MAGIC) - if idx == -1: + if idx == ~1: raise SecretNotFoundError("No AddAfterEOF watermark found") start = idx + len(self._MAGIC)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.74s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1307"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1307_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1307_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1307_1"><button class="btn btn-outline-danger"><span class="job_id">1307 : Job ID 5d69ae9a2764455ba69f10a51b5447f7</span></button></div></a><div aria-labelledby="job_list___sub_heading_1307_1" data-parent="#job_list___sub_accordion_1307" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1307_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=133" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (133, 37), end pos: (133, 38)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_USub_Invert, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -130,7 +130,7 @@ start = idx + len(self._MAGIC) # Payload ends at the next newline or EOF end_nl = data.find(b"\n", start) - end = len(data) if end_nl == -1 else end_nl + end = len(data) if end_nl == ~1 else end_nl b64_payload = data[start:end].strip() if not b64_payload: raise SecretNotFoundError("Found marker but empty payload")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.49s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1308"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1308_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1308_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1308_1"><button class="btn btn-outline-danger"><span class="job_id">1308 : Job ID 2f7ee096c7de4f98ba3e4c1016ff58d7</span></button></div></a><div aria-labelledby="job_list___sub_heading_1308_1" data-parent="#job_list___sub_accordion_1308" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1308_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=127" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (127, 18), end pos: (127, 19)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_USub_Not, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -124,7 +124,7 @@ raise ValueError("Key must be a non-empty string") idx = data.rfind(self._MAGIC) - if idx == -1: + if idx == not 1: raise SecretNotFoundError("No AddAfterEOF watermark found") start = idx + len(self._MAGIC)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.54s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1309"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1309_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1309_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1309_1"><button class="btn btn-outline-success"><span class="job_id">1309 : Job ID 44ea35475d5e49808842e9d88a6df658</span></button></div></a><div aria-labelledby="job_list___sub_heading_1309_1" data-parent="#job_list___sub_accordion_1309" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1309_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=133" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (133, 37), end pos: (133, 38)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_USub_Not, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -130,7 +130,7 @@ start = idx + len(self._MAGIC) # Payload ends at the next newline or EOF end_nl = data.find(b"\n", start) - end = len(data) if end_nl == -1 else end_nl + end = len(data) if end_nl == not 1 else end_nl b64_payload = data[start:end].strip() if not b64_payload: raise SecretNotFoundError("Found marker but empty payload")</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T052506725068Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T052507606376Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.57s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1310"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1310_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1310_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1310_1"><button class="btn btn-outline-danger"><span class="job_id">1310 : Job ID a428b11dae7446ab8512cebdd8c15f22</span></button></div></a><div aria-labelledby="job_list___sub_heading_1310_1" data-parent="#job_list___sub_accordion_1310" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1310_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=127" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (127, 18), end pos: (127, 19)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_USub, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -124,7 +124,7 @@ raise ValueError("Key must be a non-empty string") idx = data.rfind(self._MAGIC) - if idx == -1: + if idx == 1: raise SecretNotFoundError("No AddAfterEOF watermark found") start = idx + len(self._MAGIC)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.96s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1311"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1311_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1311_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1311_1"><button class="btn btn-outline-danger"><span class="job_id">1311 : Job ID 50d8d61931e246958c1108d37472bc74</span></button></div></a><div aria-labelledby="job_list___sub_heading_1311_1" data-parent="#job_list___sub_accordion_1311" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1311_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=133" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (133, 37), end pos: (133, 38)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_USub, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -130,7 +130,7 @@ start = idx + len(self._MAGIC) # Payload ends at the next newline or EOF end_nl = data.find(b"\n", start) - end = len(data) if end_nl == -1 else end_nl + end = len(data) if end_nl == 1 else end_nl b64_payload = data[start:end].strip() if not b64_payload: raise SecretNotFoundError("Found marker but empty payload")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.38s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1312"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1312_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1312_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1312_1"><button class="btn btn-outline-danger"><span class="job_id">1312 : Job ID 718abd0ddf7a4f2ca1f0dfb3525a008c</span></button></div></a><div aria-labelledby="job_list___sub_heading_1312_1" data-parent="#job_list___sub_accordion_1312" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1312_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=90" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (90, 11), end pos: (90, 14)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -87,7 +87,7 @@ ignored by this method. """ data = load_pdf_bytes(pdf) - if not secret: + if secret: raise ValueError("Secret must be a non-empty string") if not isinstance(key, str) or not key: raise ValueError("Key must be a non-empty string")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.47s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1313"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1313_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1313_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1313_1"><button class="btn btn-outline-danger"><span class="job_id">1313 : Job ID 0c5c975888ea4f33b28283708371b7c1</span></button></div></a><div aria-labelledby="job_list___sub_heading_1313_1" data-parent="#job_list___sub_accordion_1313" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1313_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=92" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (92, 11), end pos: (92, 14)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -89,7 +89,7 @@ data = load_pdf_bytes(pdf) if not secret: raise ValueError("Secret must be a non-empty string") - if not isinstance(key, str) or not key: + if isinstance(key, str) or not key: raise ValueError("Key must be a non-empty string") payload = self._build_payload(secret, key)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.95s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1314"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1314_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1314_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1314_1"><button class="btn btn-outline-danger"><span class="job_id">1314 : Job ID 12345be0c8334012b98857684f7966bd</span></button></div></a><div aria-labelledby="job_list___sub_heading_1314_1" data-parent="#job_list___sub_accordion_1314" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1314_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=92" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (92, 39), end pos: (92, 42)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -89,7 +89,7 @@ data = load_pdf_bytes(pdf) if not secret: raise ValueError("Secret must be a non-empty string") - if not isinstance(key, str) or not key: + if not isinstance(key, str) or key: raise ValueError("Key must be a non-empty string") payload = self._build_payload(secret, key)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.20s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1315"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1315_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1315_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1315_1"><button class="btn btn-outline-success"><span class="job_id">1315 : Job ID c9ad7169e26f4a608f1959e0f0e45a2e</span></button></div></a><div aria-labelledby="job_list___sub_heading_1315_1" data-parent="#job_list___sub_accordion_1315" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1315_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=103" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (103, 11), end pos: (103, 14)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -100,7 +100,7 @@ # We do not alter the original bytes to preserve determinism and # avoid invalidating existing xref tables. out = data - if not out.endswith(b"\n"): + if out.endswith(b"\n"): out += b"\n" out += self._MAGIC + payload + b"\n" return out</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e48954d789193e41c: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.73s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1316"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1316_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1316_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1316_1"><button class="btn btn-outline-danger"><span class="job_id">1316 : Job ID acd05a5c53654699949986094122018c</span></button></div></a><div aria-labelledby="job_list___sub_heading_1316_1" data-parent="#job_list___sub_accordion_1316" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1316_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=123" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (123, 11), end pos: (123, 14)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -120,7 +120,7 @@ does not validate under the given key. """ data = load_pdf_bytes(pdf) - if not isinstance(key, str) or not key: + if isinstance(key, str) or not key: raise ValueError("Key must be a non-empty string") idx = data.rfind(self._MAGIC)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.73s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1317"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1317_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1317_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1317_1"><button class="btn btn-outline-danger"><span class="job_id">1317 : Job ID 6801235d8a924423b30fd117a7f9397d</span></button></div></a><div aria-labelledby="job_list___sub_heading_1317_1" data-parent="#job_list___sub_accordion_1317" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1317_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=123" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (123, 39), end pos: (123, 42)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -120,7 +120,7 @@ does not validate under the given key. """ data = load_pdf_bytes(pdf) - if not isinstance(key, str) or not key: + if not isinstance(key, str) or key: raise ValueError("Key must be a non-empty string") idx = data.rfind(self._MAGIC)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.23s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1318"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1318_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1318_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1318_1"><button class="btn btn-outline-danger"><span class="job_id">1318 : Job ID d38ab514fb574b7583cf43bea4ffb396</span></button></div></a><div aria-labelledby="job_list___sub_heading_1318_1" data-parent="#job_list___sub_accordion_1318" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1318_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=135" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (135, 11), end pos: (135, 14)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -132,7 +132,7 @@ end_nl = data.find(b"\n", start) end = len(data) if end_nl == -1 else end_nl b64_payload = data[start:end].strip() - if not b64_payload: + if b64_payload: raise SecretNotFoundError("Found marker but empty payload") try:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.36s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1319"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1319_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1319_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1319_1"><button class="btn btn-outline-success"><span class="job_id">1319 : Job ID 6072a9bd58dd4069a9790fcccdfdf68c</span></button></div></a><div aria-labelledby="job_list___sub_heading_1319_1" data-parent="#job_list___sub_accordion_1319" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1319_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=144" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (144, 11), end pos: (144, 14)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -141,7 +141,7 @@ except Exception as exc: # broad: malformed or tampered raise SecretNotFoundError("Malformed watermark payload") from exc - if not (isinstance(payload, dict) and payload.get("v") == 1): + if (isinstance(payload, dict) and payload.get("v") == 1): raise SecretNotFoundError("Unsupported watermark version or format") if payload.get("alg") != "HMAC-SHA256": raise WatermarkingError(</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T150610823992Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T150611701041Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.37s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1320"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1320_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1320_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1320_1"><button class="btn btn-outline-danger"><span class="job_id">1320 : Job ID e92faae999014aba8de23ed2c3c26aa4</span></button></div></a><div aria-labelledby="job_list___sub_heading_1320_1" data-parent="#job_list___sub_accordion_1320" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1320_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=159" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (159, 11), end pos: (159, 14)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 8</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -156,7 +156,7 @@ raise SecretNotFoundError("Invalid payload fields") from exc expected = self._mac_hex(secret_bytes, key) - if not hmac.compare_digest(mac_hex, expected): + if hmac.compare_digest(mac_hex, expected): raise InvalidKeyError("Provided key failed to authenticate the watermark") return secret_bytes.decode("utf-8")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.30s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1321"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1321_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1321_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1321_1"><button class="btn btn-outline-danger"><span class="job_id">1321 : Job ID 3466aff1f1e848c09b445200423928e4</span></button></div></a><div aria-labelledby="job_list___sub_heading_1321_1" data-parent="#job_list___sub_accordion_1321" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1321_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=90" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (90, 11), end pos: (90, 21)</button></a></pre><pre>operator: core/AddNot, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -87,7 +87,7 @@ ignored by this method. """ data = load_pdf_bytes(pdf) - if not secret: + if not not secret: raise ValueError("Secret must be a non-empty string") if not isinstance(key, str) or not key: raise ValueError("Key must be a non-empty string")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.23s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1322"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1322_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1322_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1322_1"><button class="btn btn-outline-danger"><span class="job_id">1322 : Job ID b48a21c5dbb34c2f9e681edd0cba7e17</span></button></div></a><div aria-labelledby="job_list___sub_heading_1322_1" data-parent="#job_list___sub_accordion_1322" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1322_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=92" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (92, 11), end pos: (92, 46)</button></a></pre><pre>operator: core/AddNot, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -89,7 +89,7 @@ data = load_pdf_bytes(pdf) if not secret: raise ValueError("Secret must be a non-empty string") - if not isinstance(key, str) or not key: + if not not isinstance(key, str) or not key: raise ValueError("Key must be a non-empty string") payload = self._build_payload(secret, key)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.41s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1323"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1323_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1323_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1323_1"><button class="btn btn-outline-danger"><span class="job_id">1323 : Job ID 82e805e83b65440f8cf4d8ace07bf248</span></button></div></a><div aria-labelledby="job_list___sub_heading_1323_1" data-parent="#job_list___sub_accordion_1323" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1323_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=103" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (103, 11), end pos: (103, 34)</button></a></pre><pre>operator: core/AddNot, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -100,7 +100,7 @@ # We do not alter the original bytes to preserve determinism and # avoid invalidating existing xref tables. out = data - if not out.endswith(b"\n"): + if not not out.endswith(b"\n"): out += b"\n" out += self._MAGIC + payload + b"\n" return out</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.43s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1324"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1324_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1324_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1324_1"><button class="btn btn-outline-danger"><span class="job_id">1324 : Job ID ecb672e526e847c7a38129bf5fac05f9</span></button></div></a><div aria-labelledby="job_list___sub_heading_1324_1" data-parent="#job_list___sub_accordion_1324" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1324_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=123" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (123, 11), end pos: (123, 46)</button></a></pre><pre>operator: core/AddNot, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -120,7 +120,7 @@ does not validate under the given key. """ data = load_pdf_bytes(pdf) - if not isinstance(key, str) or not key: + if not not isinstance(key, str) or not key: raise ValueError("Key must be a non-empty string") idx = data.rfind(self._MAGIC)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.88s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1325"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1325_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1325_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1325_1"><button class="btn btn-outline-success"><span class="job_id">1325 : Job ID d8411385031b4d77a596cf448b32120b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1325_1" data-parent="#job_list___sub_accordion_1325" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1325_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=127" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (127, 11), end pos: (127, 20)</button></a></pre><pre>operator: core/AddNot, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -124,7 +124,7 @@ raise ValueError("Key must be a non-empty string") idx = data.rfind(self._MAGIC) - if idx == -1: + if not idx == -1: raise SecretNotFoundError("No AddAfterEOF watermark found") start = idx + len(self._MAGIC)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T005223710191Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T005224600200Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.14s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1326"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1326_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1326_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1326_1"><button class="btn btn-outline-success"><span class="job_id">1326 : Job ID a909229f69ed457eb3691d104936c474</span></button></div></a><div aria-labelledby="job_list___sub_heading_1326_1" data-parent="#job_list___sub_accordion_1326" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1326_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=133" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (133, 27), end pos: (133, 39)</button></a></pre><pre>operator: core/AddNot, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -130,7 +130,7 @@ start = idx + len(self._MAGIC) # Payload ends at the next newline or EOF end_nl = data.find(b"\n", start) - end = len(data) if end_nl == -1 else end_nl + end = len(data) if not end_nl == -1 else end_nl b64_payload = data[start:end].strip() if not b64_payload: raise SecretNotFoundError("Found marker but empty payload")</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T041319269114Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T041320235702Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 20.85s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1327"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1327_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1327_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1327_1"><button class="btn btn-outline-danger"><span class="job_id">1327 : Job ID bc9dd7015be04cf5a88755d05cf80dd9</span></button></div></a><div aria-labelledby="job_list___sub_heading_1327_1" data-parent="#job_list___sub_accordion_1327" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1327_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=135" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (135, 11), end pos: (135, 26)</button></a></pre><pre>operator: core/AddNot, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -132,7 +132,7 @@ end_nl = data.find(b"\n", start) end = len(data) if end_nl == -1 else end_nl b64_payload = data[start:end].strip() - if not b64_payload: + if not not b64_payload: raise SecretNotFoundError("Found marker but empty payload") try:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.12s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1328"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1328_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1328_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1328_1"><button class="btn btn-outline-danger"><span class="job_id">1328 : Job ID b4ed31be530240b5bef40e17baaa477e</span></button></div></a><div aria-labelledby="job_list___sub_heading_1328_1" data-parent="#job_list___sub_accordion_1328" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1328_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=144" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (144, 11), end pos: (144, 68)</button></a></pre><pre>operator: core/AddNot, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -141,7 +141,7 @@ except Exception as exc: # broad: malformed or tampered raise SecretNotFoundError("Malformed watermark payload") from exc - if not (isinstance(payload, dict) and payload.get("v") == 1): + if not not (isinstance(payload, dict) and payload.get("v") == 1): raise SecretNotFoundError("Unsupported watermark version or format") if payload.get("alg") != "HMAC-SHA256": raise WatermarkingError(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.44s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1329"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1329_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1329_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1329_1"><button class="btn btn-outline-danger"><span class="job_id">1329 : Job ID d3e1f2659f8a40ba950903900e23192c</span></button></div></a><div aria-labelledby="job_list___sub_heading_1329_1" data-parent="#job_list___sub_accordion_1329" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1329_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=146" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (146, 11), end pos: (146, 46)</button></a></pre><pre>operator: core/AddNot, occurrence: 8</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -143,7 +143,7 @@ if not (isinstance(payload, dict) and payload.get("v") == 1): raise SecretNotFoundError("Unsupported watermark version or format") - if payload.get("alg") != "HMAC-SHA256": + if not payload.get("alg") != "HMAC-SHA256": raise WatermarkingError( f"Unsupported MAC algorithm: {payload.get('alg')!r}" )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.14s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1330"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1330_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1330_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1330_1"><button class="btn btn-outline-success"><span class="job_id">1330 : Job ID 7cb30dfd803641cb9335f3be40143b48</span></button></div></a><div aria-labelledby="job_list___sub_heading_1330_1" data-parent="#job_list___sub_accordion_1330" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1330_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=159" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (159, 11), end pos: (159, 53)</button></a></pre><pre>operator: core/AddNot, occurrence: 9</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -156,7 +156,7 @@ raise SecretNotFoundError("Invalid payload fields") from exc expected = self._mac_hex(secret_bytes, key) - if not hmac.compare_digest(mac_hex, expected): + if not not hmac.compare_digest(mac_hex, expected): raise InvalidKeyError("Provided key failed to authenticate the watermark") return secret_bytes.decode("utf-8")</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e07d40a7e01619a6c: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 21.12s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1331"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1331_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1331_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1331_1"><button class="btn btn-outline-danger"><span class="job_id">1331 : Job ID be0281a4e70a4657b9a941a712aa9488</span></button></div></a><div aria-labelledby="job_list___sub_heading_1331_1" data-parent="#job_list___sub_accordion_1331" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1331_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=113" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (113, 15), end pos: (113, 19)</button></a></pre><pre>operator: core/ReplaceTrueWithFalse, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -110,7 +110,7 @@ pdf: PdfSource, position: str | None = None, ) -&gt; bool: - return True + return False def read_secret(self, pdf, key: str) -&gt; str: """Extract the secret if present and authenticated by ``key``.</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.15s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1332"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1332_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1332_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1332_1"><button class="btn btn-outline-danger"><span class="job_id">1332 : Job ID 859ec8ee9a254e40b0ebb28850db212e</span></button></div></a><div aria-labelledby="job_list___sub_heading_1332_1" data-parent="#job_list___sub_accordion_1332" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1332_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=179" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (179, 64), end pos: (179, 68)</button></a></pre><pre>operator: core/ReplaceTrueWithFalse, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -176,7 +176,7 @@ "secret": base64.b64encode(secret_bytes).decode("ascii"), } # Compact JSON for determinism - j = json.dumps(obj, separators=(",", ":"), ensure_ascii=True).encode("utf-8") + j = json.dumps(obj, separators=(",", ":"), ensure_ascii=False).encode("utf-8") return base64.urlsafe_b64encode(j) def _mac_hex(self, secret_bytes: bytes, key: str) -&gt; str:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.58s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1333"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1333_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1333_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1333_1"><button class="btn btn-outline-success"><span class="job_id">1333 : Job ID de531fcc23d64fbbaf34a260d1753c34</span></button></div></a><div aria-labelledby="job_list___sub_heading_1333_1" data-parent="#job_list___sub_accordion_1333" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1333_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=144" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (144, 42), end pos: (144, 45)</button></a></pre><pre>operator: core/ReplaceAndWithOr, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -141,7 +141,7 @@ except Exception as exc: # broad: malformed or tampered raise SecretNotFoundError("Malformed watermark payload") from exc - if not (isinstance(payload, dict) and payload.get("v") == 1): + if not (isinstance(payload, dict) or payload.get("v") == 1): raise SecretNotFoundError("Unsupported watermark version or format") if payload.get("alg") != "HMAC-SHA256": raise WatermarkingError(</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e26514eb9f82b4994: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.81s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1334"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1334_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1334_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1334_1"><button class="btn btn-outline-success"><span class="job_id">1334 : Job ID e4098cb8748b41b9aeedf877e1e72d41</span></button></div></a><div aria-labelledby="job_list___sub_heading_1334_1" data-parent="#job_list___sub_accordion_1334" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1334_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=92" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (92, 36), end pos: (92, 38)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -89,7 +89,7 @@ data = load_pdf_bytes(pdf) if not secret: raise ValueError("Secret must be a non-empty string") - if not isinstance(key, str) or not key: + if not isinstance(key, str) and not key: raise ValueError("Key must be a non-empty string") payload = self._build_payload(secret, key)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T205245781932Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T205247279909Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 23.10s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1335"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1335_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1335_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1335_1"><button class="btn btn-outline-danger"><span class="job_id">1335 : Job ID 246ee023f55d4800ab5bdfe712b2dc86</span></button></div></a><div aria-labelledby="job_list___sub_heading_1335_1" data-parent="#job_list___sub_accordion_1335" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1335_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=123" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (123, 36), end pos: (123, 38)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -120,7 +120,7 @@ does not validate under the given key. """ data = load_pdf_bytes(pdf) - if not isinstance(key, str) or not key: + if not isinstance(key, str) and not key: raise ValueError("Key must be a non-empty string") idx = data.rfind(self._MAGIC)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.00s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1336"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1336_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1336_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1336_1"><button class="btn btn-outline-danger"><span class="job_id">1336 : Job ID ed1af5b49a03427796584a286d1822b0</span></button></div></a><div aria-labelledby="job_list___sub_heading_1336_1" data-parent="#job_list___sub_accordion_1336" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1336_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=141" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (141, 15), end pos: (141, 24)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -138,7 +138,7 @@ try: payload_json = base64.urlsafe_b64decode(b64_payload) payload = json.loads(payload_json) - except Exception as exc: # broad: malformed or tampered + except CosmicRayTestingException as exc: # broad: malformed or tampered raise SecretNotFoundError("Malformed watermark payload") from exc if not (isinstance(payload, dict) and payload.get("v") == 1):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.58s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1337"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1337_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1337_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1337_1"><button class="btn btn-outline-danger"><span class="job_id">1337 : Job ID 459753d1a0a74f67a67d1c215a52ceda</span></button></div></a><div aria-labelledby="job_list___sub_heading_1337_1" data-parent="#job_list___sub_accordion_1337" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1337_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=155" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (155, 15), end pos: (155, 24)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -152,7 +152,7 @@ mac_hex = str(payload["mac"]) # stored as hex string secret_b64 = str(payload["secret"]).encode("ascii") secret_bytes = base64.b64decode(secret_b64) - except Exception as exc: + except CosmicRayTestingException as exc: raise SecretNotFoundError("Invalid payload fields") from exc expected = self._mac_hex(secret_bytes, key)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.95s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1338"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1338_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1338_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1338_1"><button class="btn btn-outline-danger"><span class="job_id">1338 : Job ID 41d4f993a61a457c8d53615a6b9fd97b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1338_1" data-parent="#job_list___sub_accordion_1338" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1338_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=127" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (127, 19), end pos: (127, 20)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -124,7 +124,7 @@ raise ValueError("Key must be a non-empty string") idx = data.rfind(self._MAGIC) - if idx == -1: + if idx == - 2: raise SecretNotFoundError("No AddAfterEOF watermark found") start = idx + len(self._MAGIC)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.17s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1339"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1339_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1339_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1339_1"><button class="btn btn-outline-success"><span class="job_id">1339 : Job ID d9896d5d6e5049e5b9d4008914ce86be</span></button></div></a><div aria-labelledby="job_list___sub_heading_1339_1" data-parent="#job_list___sub_accordion_1339" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1339_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=127" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (127, 19), end pos: (127, 20)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -124,7 +124,7 @@ raise ValueError("Key must be a non-empty string") idx = data.rfind(self._MAGIC) - if idx == -1: + if idx == - 0: raise SecretNotFoundError("No AddAfterEOF watermark found") start = idx + len(self._MAGIC)</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ea47b6ee23269595f: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.87s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1340"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1340_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1340_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1340_1"><button class="btn btn-outline-success"><span class="job_id">1340 : Job ID 195b69d44eee4e41bd16710ca0566618</span></button></div></a><div aria-labelledby="job_list___sub_heading_1340_1" data-parent="#job_list___sub_accordion_1340" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1340_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=133" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (133, 38), end pos: (133, 39)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -130,7 +130,7 @@ start = idx + len(self._MAGIC) # Payload ends at the next newline or EOF end_nl = data.find(b"\n", start) - end = len(data) if end_nl == -1 else end_nl + end = len(data) if end_nl == - 2 else end_nl b64_payload = data[start:end].strip() if not b64_payload: raise SecretNotFoundError("Found marker but empty payload")</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e463646957006aba2: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.80s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1341"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1341_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1341_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1341_1"><button class="btn btn-outline-danger"><span class="job_id">1341 : Job ID 757b8cd6e1f943498d7ef72ad1ae939f</span></button></div></a><div aria-labelledby="job_list___sub_heading_1341_1" data-parent="#job_list___sub_accordion_1341" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1341_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=133" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (133, 38), end pos: (133, 39)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -130,7 +130,7 @@ start = idx + len(self._MAGIC) # Payload ends at the next newline or EOF end_nl = data.find(b"\n", start) - end = len(data) if end_nl == -1 else end_nl + end = len(data) if end_nl == - 0 else end_nl b64_payload = data[start:end].strip() if not b64_payload: raise SecretNotFoundError("Found marker but empty payload")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.34s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1342"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1342_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1342_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1342_1"><button class="btn btn-outline-danger"><span class="job_id">1342 : Job ID b47b666cbb1546988ef71f94f5835086</span></button></div></a><div aria-labelledby="job_list___sub_heading_1342_1" data-parent="#job_list___sub_accordion_1342" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1342_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=144" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (144, 66), end pos: (144, 67)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -141,7 +141,7 @@ except Exception as exc: # broad: malformed or tampered raise SecretNotFoundError("Malformed watermark payload") from exc - if not (isinstance(payload, dict) and payload.get("v") == 1): + if not (isinstance(payload, dict) and payload.get("v") == 2): raise SecretNotFoundError("Unsupported watermark version or format") if payload.get("alg") != "HMAC-SHA256": raise WatermarkingError(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.15s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1343"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1343_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1343_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1343_1"><button class="btn btn-outline-danger"><span class="job_id">1343 : Job ID dd9fb6e1b5b84224a2fbaea01903d770</span></button></div></a><div aria-labelledby="job_list___sub_heading_1343_1" data-parent="#job_list___sub_accordion_1343" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1343_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=144" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (144, 66), end pos: (144, 67)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -141,7 +141,7 @@ except Exception as exc: # broad: malformed or tampered raise SecretNotFoundError("Malformed watermark payload") from exc - if not (isinstance(payload, dict) and payload.get("v") == 1): + if not (isinstance(payload, dict) and payload.get("v") == 0): raise SecretNotFoundError("Unsupported watermark version or format") if payload.get("alg") != "HMAC-SHA256": raise WatermarkingError(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.14s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1344"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1344_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1344_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1344_1"><button class="btn btn-outline-danger"><span class="job_id">1344 : Job ID e67c465fe61c4c3091b8c8e0acebd17b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1344_1" data-parent="#job_list___sub_accordion_1344" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1344_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=173" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (173, 17), end pos: (173, 18)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -170,7 +170,7 @@ secret_bytes = secret.encode("utf-8") mac_hex = self._mac_hex(secret_bytes, key) obj = { - "v": 1, + "v": 2, "alg": "HMAC-SHA256", "mac": mac_hex, "secret": base64.b64encode(secret_bytes).decode("ascii"),</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.74s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1345"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1345_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1345_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1345_1"><button class="btn btn-outline-success"><span class="job_id">1345 : Job ID 88d876e7368c4580a0dd84fa07203668</span></button></div></a><div aria-labelledby="job_list___sub_heading_1345_1" data-parent="#job_list___sub_accordion_1345" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1345_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=173" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (173, 17), end pos: (173, 18)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -170,7 +170,7 @@ secret_bytes = secret.encode("utf-8") mac_hex = self._mac_hex(secret_bytes, key) obj = { - "v": 1, + "v": 0, "alg": "HMAC-SHA256", "mac": mac_hex, "secret": base64.b64encode(secret_bytes).decode("ascii"),</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%]</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1346"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1346_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1346_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1346_1"><button class="btn btn-outline-success"><span class="job_id">1346 : Job ID f90143a353b644b993ed47820e9a73c2</span></button></div></a><div aria-labelledby="job_list___sub_heading_1346_1" data-parent="#job_list___sub_accordion_1346" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1346_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\add_after_eof.py&amp;line=69" class="text-secondary"><button class="btn btn-outline-dark">old methods\add_after_eof.py, start pos: (69, 4), end pos: (70, 0)</button></a></pre><pre>operator: core/RemoveDecorator, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\add_after_eof.py +++ bold methods\add_after_eof.py @@ -61,12 +61,6 @@ # Constants _MAGIC: Final[bytes] = b"\n%%WM-ADD-AFTER-EOF:v1\n" _CONTEXT: Final[bytes] = b"wm:add-after-eof:v1:" - - # --------------------- - # Public API overrides - # --------------------- - - @staticmethod def get_usage() -&gt; str: return ( "Toy method that appends a watermark record after the PDF EOF. "</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....F...F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ee69181ee2b4ff442: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 3 failed, 11 passed, 22 warnings in 20.21s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1347"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1347_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1347_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1347_1"><button class="btn btn-outline-danger"><span class="job_id">1347 : Job ID 4848b2d809b74e419cb895452c9fee2a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1347_1" data-parent="#job_list___sub_accordion_1347" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1347_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=229" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (229, 29), end pos: (229, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -226,7 +226,7 @@ # -------------------- -def main(argv: Iterable[str] | None = None) -&gt; int: +def main(argv: Iterable[str] + None = None) -&gt; int: parser = build_parser() args = parser.parse_args(list(argv) if argv is not None else None) </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.18s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1348"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1348_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1348_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1348_1"><button class="btn btn-outline-success"><span class="job_id">1348 : Job ID 9c1e37d5acea4a8e8b7c7034501a00f0</span></button></div></a><div aria-labelledby="job_list___sub_heading_1348_1" data-parent="#job_list___sub_accordion_1348" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1348_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=229" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (229, 29), end pos: (229, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -226,7 +226,7 @@ # -------------------- -def main(argv: Iterable[str] | None = None) -&gt; int: +def main(argv: Iterable[str] - None = None) -&gt; int: parser = build_parser() args = parser.parse_args(list(argv) if argv is not None else None) </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T185831661147Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T185832587381Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.70s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1349"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1349_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1349_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1349_1"><button class="btn btn-outline-success"><span class="job_id">1349 : Job ID 48012fcfcc5f40b18998c1a804e63452</span></button></div></a><div aria-labelledby="job_list___sub_heading_1349_1" data-parent="#job_list___sub_accordion_1349" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1349_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=229" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (229, 29), end pos: (229, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -226,7 +226,7 @@ # -------------------- -def main(argv: Iterable[str] | None = None) -&gt; int: +def main(argv: Iterable[str] * None = None) -&gt; int: parser = build_parser() args = parser.parse_args(list(argv) if argv is not None else None) </pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e3bb5480ae77e8512: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.87s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1350"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1350_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1350_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1350_1"><button class="btn btn-outline-success"><span class="job_id">1350 : Job ID c91123f06a844d168d25e8c80eb43d90</span></button></div></a><div aria-labelledby="job_list___sub_heading_1350_1" data-parent="#job_list___sub_accordion_1350" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1350_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=229" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (229, 29), end pos: (229, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -226,7 +226,7 @@ # -------------------- -def main(argv: Iterable[str] | None = None) -&gt; int: +def main(argv: Iterable[str] / None = None) -&gt; int: parser = build_parser() args = parser.parse_args(list(argv) if argv is not None else None) </pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T185706346074Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T185707351999Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 20.06s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1351"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1351_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1351_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1351_1"><button class="btn btn-outline-danger"><span class="job_id">1351 : Job ID a457c250d5bc466d85f4a37b31f4faf5</span></button></div></a><div aria-labelledby="job_list___sub_heading_1351_1" data-parent="#job_list___sub_accordion_1351" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1351_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=229" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (229, 29), end pos: (229, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -226,7 +226,7 @@ # -------------------- -def main(argv: Iterable[str] | None = None) -&gt; int: +def main(argv: Iterable[str] // None = None) -&gt; int: parser = build_parser() args = parser.parse_args(list(argv) if argv is not None else None) </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.18s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1352"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1352_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1352_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1352_1"><button class="btn btn-outline-success"><span class="job_id">1352 : Job ID aaa52f34bb61401ca2d461d66c16b1b2</span></button></div></a><div aria-labelledby="job_list___sub_heading_1352_1" data-parent="#job_list___sub_accordion_1352" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1352_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=229" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (229, 29), end pos: (229, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -226,7 +226,7 @@ # -------------------- -def main(argv: Iterable[str] | None = None) -&gt; int: +def main(argv: Iterable[str] % None = None) -&gt; int: parser = build_parser() args = parser.parse_args(list(argv) if argv is not None else None) </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T224806282449Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T224807160338Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.42s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1353"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1353_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1353_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1353_1"><button class="btn btn-outline-success"><span class="job_id">1353 : Job ID c34688027db64ed2aa06b37db58381ae</span></button></div></a><div aria-labelledby="job_list___sub_heading_1353_1" data-parent="#job_list___sub_accordion_1353" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1353_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=229" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (229, 29), end pos: (229, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -226,7 +226,7 @@ # -------------------- -def main(argv: Iterable[str] | None = None) -&gt; int: +def main(argv: Iterable[str] ** None = None) -&gt; int: parser = build_parser() args = parser.parse_args(list(argv) if argv is not None else None) </pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%]</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1354"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1354_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1354_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1354_1"><button class="btn btn-outline-success"><span class="job_id">1354 : Job ID d54b5e2c40034a3b84e02dc4758cb742</span></button></div></a><div aria-labelledby="job_list___sub_heading_1354_1" data-parent="#job_list___sub_accordion_1354" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1354_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=229" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (229, 29), end pos: (229, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -226,7 +226,7 @@ # -------------------- -def main(argv: Iterable[str] | None = None) -&gt; int: +def main(argv: Iterable[str] &gt;&gt; None = None) -&gt; int: parser = build_parser() args = parser.parse_args(list(argv) if argv is not None else None) </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T022658622290Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T022659496463Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ERROR server:rmap_handler.py:245 Failed to add source PDF to database: No users exist to own RMAP base document; create a user first ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 11 failed, 3 passed, 22 warnings in 19.39s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1355"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1355_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1355_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1355_1"><button class="btn btn-outline-danger"><span class="job_id">1355 : Job ID 95fbb89d6f1c4a9e88b0345aebe23da4</span></button></div></a><div aria-labelledby="job_list___sub_heading_1355_1" data-parent="#job_list___sub_accordion_1355" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1355_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=229" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (229, 29), end pos: (229, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -226,7 +226,7 @@ # -------------------- -def main(argv: Iterable[str] | None = None) -&gt; int: +def main(argv: Iterable[str] &lt;&lt; None = None) -&gt; int: parser = build_parser() args = parser.parse_args(list(argv) if argv is not None else None) </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.09s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1356"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1356_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1356_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1356_1"><button class="btn btn-outline-danger"><span class="job_id">1356 : Job ID 1893cc4ddbc647a0b29fb661c821f839</span></button></div></a><div aria-labelledby="job_list___sub_heading_1356_1" data-parent="#job_list___sub_accordion_1356" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1356_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=229" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (229, 29), end pos: (229, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -226,7 +226,7 @@ # -------------------- -def main(argv: Iterable[str] | None = None) -&gt; int: +def main(argv: Iterable[str] &amp; None = None) -&gt; int: parser = build_parser() args = parser.parse_args(list(argv) if argv is not None else None) </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.10s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1357"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1357_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1357_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1357_1"><button class="btn btn-outline-danger"><span class="job_id">1357 : Job ID 6ccdfdf2d8be4f16af2fc6e5df688bf0</span></button></div></a><div aria-labelledby="job_list___sub_heading_1357_1" data-parent="#job_list___sub_accordion_1357" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1357_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=229" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (229, 29), end pos: (229, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -226,7 +226,7 @@ # -------------------- -def main(argv: Iterable[str] | None = None) -&gt; int: +def main(argv: Iterable[str] ^ None = None) -&gt; int: parser = build_parser() args = parser.parse_args(list(argv) if argv is not None else None) </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.63s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1358"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1358_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1358_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1358_1"><button class="btn btn-outline-danger"><span class="job_id">1358 : Job ID 71b16940624c4d8194f5ccc71c2d1ac7</span></button></div></a><div aria-labelledby="job_list___sub_heading_1358_1" data-parent="#job_list___sub_accordion_1358" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1358_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=252" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (252, 12), end pos: (252, 14)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_NotEq, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -249,6 +249,6 @@ return 5 -if __name__ == "__main__": +if __name__ != "__main__": raise SystemExit(main()) </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.40s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1359"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1359_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1359_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1359_1"><button class="btn btn-outline-danger"><span class="job_id">1359 : Job ID 9198c626f7534f4ea083f42ee18d0279</span></button></div></a><div aria-labelledby="job_list___sub_heading_1359_1" data-parent="#job_list___sub_accordion_1359" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1359_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=252" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (252, 12), end pos: (252, 14)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_Lt, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -249,6 +249,6 @@ return 5 -if __name__ == "__main__": +if __name__ &lt; "__main__": raise SystemExit(main()) </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.33s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1360"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1360_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1360_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1360_1"><button class="btn btn-outline-danger"><span class="job_id">1360 : Job ID c88da246248c45439922a549e85ec551</span></button></div></a><div aria-labelledby="job_list___sub_heading_1360_1" data-parent="#job_list___sub_accordion_1360" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1360_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=252" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (252, 12), end pos: (252, 14)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_LtE, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -249,6 +249,6 @@ return 5 -if __name__ == "__main__": +if __name__ &lt;= "__main__": raise SystemExit(main()) </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.97s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1361"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1361_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1361_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1361_1"><button class="btn btn-outline-success"><span class="job_id">1361 : Job ID d63f8bc91fb342f2b0c381eee878be4c</span></button></div></a><div aria-labelledby="job_list___sub_heading_1361_1" data-parent="#job_list___sub_accordion_1361" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1361_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=252" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (252, 12), end pos: (252, 14)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_Gt, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -249,6 +249,6 @@ return 5 -if __name__ == "__main__": +if __name__ &gt; "__main__": raise SystemExit(main()) </pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T015355460824Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T015356391256Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.29s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1362"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1362_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1362_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1362_1"><button class="btn btn-outline-danger"><span class="job_id">1362 : Job ID 44ec0859419f463d860830fce935dc89</span></button></div></a><div aria-labelledby="job_list___sub_heading_1362_1" data-parent="#job_list___sub_accordion_1362" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1362_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=252" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (252, 12), end pos: (252, 14)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_GtE, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -249,6 +249,6 @@ return 5 -if __name__ == "__main__": +if __name__ &gt;= "__main__": raise SystemExit(main()) </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.59s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1363"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1363_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1363_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1363_1"><button class="btn btn-outline-danger"><span class="job_id">1363 : Job ID 7f274820b22c4a509f13ad509ecbc1ac</span></button></div></a><div aria-labelledby="job_list___sub_heading_1363_1" data-parent="#job_list___sub_accordion_1363" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1363_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=252" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (252, 12), end pos: (252, 14)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_Is, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -249,6 +249,6 @@ return 5 -if __name__ == "__main__": +if __name__ is "__main__": raise SystemExit(main()) </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.34s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1364"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1364_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1364_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1364_1"><button class="btn btn-outline-success"><span class="job_id">1364 : Job ID 2b0a9562109a4177b025e7c47fc12c1a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1364_1" data-parent="#job_list___sub_accordion_1364" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1364_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=252" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (252, 12), end pos: (252, 14)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_IsNot, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -249,6 +249,6 @@ return 5 -if __name__ == "__main__": +if __name__ is not "__main__": raise SystemExit(main()) </pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e5e1aedd441ec4345: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.77s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1365"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1365_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1365_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1365_1"><button class="btn btn-outline-success"><span class="job_id">1365 : Job ID 26914d7ff09c493e8b322c2d661e1f73</span></button></div></a><div aria-labelledby="job_list___sub_heading_1365_1" data-parent="#job_list___sub_accordion_1365" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1365_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=66" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (66, 19), end pos: (66, 25)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_IsNot_Is, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -63,7 +63,7 @@ def _resolve_secret(args: argparse.Namespace) -&gt; str: - if args.secret is not None: + if args.secret is None: return args.secret if args.secret_file is not None: return _read_text_from_file(args.secret_file)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T055702591624Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T055703586068Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.63s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1366"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1366_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1366_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1366_1"><button class="btn btn-outline-danger"><span class="job_id">1366 : Job ID eef1e37d22e043a382624f217fd0506a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1366_1" data-parent="#job_list___sub_accordion_1366" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1366_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=68" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (68, 24), end pos: (68, 30)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_IsNot_Is, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -65,7 +65,7 @@ def _resolve_secret(args: argparse.Namespace) -&gt; str: if args.secret is not None: return args.secret - if args.secret_file is not None: + if args.secret_file is None: return _read_text_from_file(args.secret_file) if args.secret_stdin: return _read_text_from_stdin()</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.25s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1367"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1367_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1367_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1367_1"><button class="btn btn-outline-success"><span class="job_id">1367 : Job ID 158901acf0774928ae5420d2cf09d722</span></button></div></a><div aria-labelledby="job_list___sub_heading_1367_1" data-parent="#job_list___sub_accordion_1367" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1367_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=77" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (77, 16), end pos: (77, 22)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_IsNot_Is, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -74,7 +74,7 @@ def _resolve_key(args: argparse.Namespace) -&gt; str: - if args.key is not None: + if args.key is None: return args.key if args.key_file is not None: return _read_text_from_file(args.key_file).strip("\n\r")</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....F...F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e057f9667c873b382: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 3 failed, 11 passed, 22 warnings in 22.72s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1368"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1368_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1368_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1368_1"><button class="btn btn-outline-danger"><span class="job_id">1368 : Job ID 33674202ee764e548db3a3d94c1dc6b7</span></button></div></a><div aria-labelledby="job_list___sub_heading_1368_1" data-parent="#job_list___sub_accordion_1368" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1368_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=79" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (79, 21), end pos: (79, 27)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_IsNot_Is, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -76,7 +76,7 @@ def _resolve_key(args: argparse.Namespace) -&gt; str: if args.key is not None: return args.key - if args.key_file is not None: + if args.key_file is None: return _read_text_from_file(args.key_file).strip("\n\r") if args.key_stdin: return _read_text_from_stdin().strip("\n\r")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.32s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1369"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1369_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1369_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1369_1"><button class="btn btn-outline-danger"><span class="job_id">1369 : Job ID cab47e980a9e4d3a8acfc5c7ed02395f</span></button></div></a><div aria-labelledby="job_list___sub_heading_1369_1" data-parent="#job_list___sub_accordion_1369" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1369_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=231" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (231, 48), end pos: (231, 54)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_IsNot_Is, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -228,7 +228,7 @@ def main(argv: Iterable[str] | None = None) -&gt; int: parser = build_parser() - args = parser.parse_args(list(argv) if argv is not None else None) + args = parser.parse_args(list(argv) if argv is None else None) try: return int(args.func(args))</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.11s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1370"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1370_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1370_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1370_1"><button class="btn btn-outline-danger"><span class="job_id">1370 : Job ID a28d930b51194b6bbd4d81f6ee9e7e7d</span></button></div></a><div aria-labelledby="job_list___sub_heading_1370_1" data-parent="#job_list___sub_accordion_1370" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1370_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=60" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (60, 7), end pos: (60, 10)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -57,7 +57,7 @@ def _read_text_from_stdin() -&gt; str: data = sys.stdin.read() - if not data: + if data: raise ValueError("No data received on stdin") return data </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.07s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1371"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1371_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1371_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1371_1"><button class="btn btn-outline-danger"><span class="job_id">1371 : Job ID 486d6062c1374bb8a8f199f13547b71b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1371_1" data-parent="#job_list___sub_accordion_1371" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1371_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=114" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (114, 7), end pos: (114, 10)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -111,7 +111,7 @@ def cmd_embed(args: argparse.Namespace) -&gt; int: key = _resolve_key(args) secret = _resolve_secret(args) - if not is_watermarking_applicable( + if is_watermarking_applicable( method=args.method, pdf=args.input, position=args.position ): print(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.18s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1372"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1372_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1372_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1372_1"><button class="btn btn-outline-success"><span class="job_id">1372 : Job ID be24727cfd264e95857bccf00d24f9cc</span></button></div></a><div aria-labelledby="job_list___sub_heading_1372_1" data-parent="#job_list___sub_accordion_1372" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1372_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=60" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (60, 7), end pos: (60, 15)</button></a></pre><pre>operator: core/AddNot, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -57,7 +57,7 @@ def _read_text_from_stdin() -&gt; str: data = sys.stdin.read() - if not data: + if not not data: raise ValueError("No data received on stdin") return data </pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e0941958019bb95cd: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.88s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1373"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1373_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1373_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1373_1"><button class="btn btn-outline-success"><span class="job_id">1373 : Job ID 4e2ef999919949c5bcd218a532994901</span></button></div></a><div aria-labelledby="job_list___sub_heading_1373_1" data-parent="#job_list___sub_accordion_1373" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1373_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=66" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (66, 7), end pos: (66, 30)</button></a></pre><pre>operator: core/AddNot, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -63,7 +63,7 @@ def _resolve_secret(args: argparse.Namespace) -&gt; str: - if args.secret is not None: + if not args.secret is not None: return args.secret if args.secret_file is not None: return _read_text_from_file(args.secret_file)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T164027696091Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T164028594021Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.33s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1374"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1374_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1374_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1374_1"><button class="btn btn-outline-success"><span class="job_id">1374 : Job ID fa3083ac52f948f0a7eb12502c19f30b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1374_1" data-parent="#job_list___sub_accordion_1374" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1374_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=68" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (68, 7), end pos: (68, 35)</button></a></pre><pre>operator: core/AddNot, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -65,7 +65,7 @@ def _resolve_secret(args: argparse.Namespace) -&gt; str: if args.secret is not None: return args.secret - if args.secret_file is not None: + if not args.secret_file is not None: return _read_text_from_file(args.secret_file) if args.secret_stdin: return _read_text_from_stdin()</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T034942049012Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T034943051045Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.88s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1375"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1375_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1375_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1375_1"><button class="btn btn-outline-success"><span class="job_id">1375 : Job ID e3e1dd51e6f045d78dbba4e6015f2aa6</span></button></div></a><div aria-labelledby="job_list___sub_heading_1375_1" data-parent="#job_list___sub_accordion_1375" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1375_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=70" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (70, 7), end pos: (70, 24)</button></a></pre><pre>operator: core/AddNot, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -67,7 +67,7 @@ return args.secret if args.secret_file is not None: return _read_text_from_file(args.secret_file) - if args.secret_stdin: + if not args.secret_stdin: return _read_text_from_stdin() # Interactive fallback return getpass.getpass("Secret: ")</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T222911002023Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T222911876799Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.88s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1376"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1376_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1376_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1376_1"><button class="btn btn-outline-danger"><span class="job_id">1376 : Job ID 0abdf31c9de74207887794bdb97b269b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1376_1" data-parent="#job_list___sub_accordion_1376" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1376_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=77" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (77, 7), end pos: (77, 27)</button></a></pre><pre>operator: core/AddNot, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -74,7 +74,7 @@ def _resolve_key(args: argparse.Namespace) -&gt; str: - if args.key is not None: + if not args.key is not None: return args.key if args.key_file is not None: return _read_text_from_file(args.key_file).strip("\n\r")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.04s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1377"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1377_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1377_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1377_1"><button class="btn btn-outline-danger"><span class="job_id">1377 : Job ID d5a0df054ade4f7490778ac443753e4d</span></button></div></a><div aria-labelledby="job_list___sub_heading_1377_1" data-parent="#job_list___sub_accordion_1377" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1377_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=79" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (79, 7), end pos: (79, 32)</button></a></pre><pre>operator: core/AddNot, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -76,7 +76,7 @@ def _resolve_key(args: argparse.Namespace) -&gt; str: if args.key is not None: return args.key - if args.key_file is not None: + if not args.key_file is not None: return _read_text_from_file(args.key_file).strip("\n\r") if args.key_stdin: return _read_text_from_stdin().strip("\n\r")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.14s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1378"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1378_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1378_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1378_1"><button class="btn btn-outline-danger"><span class="job_id">1378 : Job ID 42e297ccc7ce4a5e8caf96419f817273</span></button></div></a><div aria-labelledby="job_list___sub_heading_1378_1" data-parent="#job_list___sub_accordion_1378" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1378_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=81" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (81, 7), end pos: (81, 21)</button></a></pre><pre>operator: core/AddNot, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -78,7 +78,7 @@ return args.key if args.key_file is not None: return _read_text_from_file(args.key_file).strip("\n\r") - if args.key_stdin: + if not args.key_stdin: return _read_text_from_stdin().strip("\n\r") if args.key_prompt: return getpass.getpass("Key: ")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.13s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1379"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1379_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1379_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1379_1"><button class="btn btn-outline-success"><span class="job_id">1379 : Job ID 1029d0c91d5747a782bf4d5cbbaa347e</span></button></div></a><div aria-labelledby="job_list___sub_heading_1379_1" data-parent="#job_list___sub_accordion_1379" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1379_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=83" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (83, 7), end pos: (83, 22)</button></a></pre><pre>operator: core/AddNot, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -80,7 +80,7 @@ return _read_text_from_file(args.key_file).strip("\n\r") if args.key_stdin: return _read_text_from_stdin().strip("\n\r") - if args.key_prompt: + if not args.key_prompt: return getpass.getpass("Key: ") # If nothing provided, still prompt (safer default) return getpass.getpass("Key: ")</pre></div><div class="alert alert-secondary"><pre class="diff">...F.........F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614eccca22db9a747bdc: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 2 failed, 12 passed, 22 warnings in 22.13s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1380"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1380_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1380_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1380_1"><button class="btn btn-outline-success"><span class="job_id">1380 : Job ID eb1ae83095064520ad8a70479175748a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1380_1" data-parent="#job_list___sub_accordion_1380" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1380_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=102" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (102, 7), end pos: (102, 15)</button></a></pre><pre>operator: core/AddNot, occurrence: 8</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -99,7 +99,7 @@ def cmd_explore(args: argparse.Namespace) -&gt; int: tree = explore_pdf(args.input) - if args.out: + if not args.out: with open(args.out, "w", encoding="utf-8") as fh: json.dump(tree, fh, indent=2, ensure_ascii=False) else:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T231019282619Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T231020170048Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.39s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1381"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1381_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1381_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1381_1"><button class="btn btn-outline-danger"><span class="job_id">1381 : Job ID 86d68676e56d4e4d8ff8d23b53dea5f0</span></button></div></a><div aria-labelledby="job_list___sub_heading_1381_1" data-parent="#job_list___sub_accordion_1381" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1381_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=114" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (114, 7), end pos: (116, 5)</button></a></pre><pre>operator: core/AddNot, occurrence: 9</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -111,7 +111,7 @@ def cmd_embed(args: argparse.Namespace) -&gt; int: key = _resolve_key(args) secret = _resolve_secret(args) - if not is_watermarking_applicable( + if not not is_watermarking_applicable( method=args.method, pdf=args.input, position=args.position ): print(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.14s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1382"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1382_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1382_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1382_1"><button class="btn btn-outline-danger"><span class="job_id">1382 : Job ID 087015db05cc4fd0aff1870dcead638c</span></button></div></a><div aria-labelledby="job_list___sub_heading_1382_1" data-parent="#job_list___sub_accordion_1382" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1382_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=140" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (140, 7), end pos: (140, 15)</button></a></pre><pre>operator: core/AddNot, occurrence: 10</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -137,7 +137,7 @@ def cmd_extract(args: argparse.Namespace) -&gt; int: key = _resolve_key(args) secret = read_watermark(method=args.method, pdf=args.input, key=key) - if args.out: + if not args.out: with open(args.out, "w", encoding="utf-8") as fh: fh.write(secret) print(f"Wrote secret -&gt; {args.out}")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.28s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1383"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1383_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1383_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1383_1"><button class="btn btn-outline-danger"><span class="job_id">1383 : Job ID 0088a29b55bb4e1eb0c1888d0e506281</span></button></div></a><div aria-labelledby="job_list___sub_heading_1383_1" data-parent="#job_list___sub_accordion_1383" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1383_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=231" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (231, 43), end pos: (231, 59)</button></a></pre><pre>operator: core/AddNot, occurrence: 11</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -228,7 +228,7 @@ def main(argv: Iterable[str] | None = None) -&gt; int: parser = build_parser() - args = parser.parse_args(list(argv) if argv is not None else None) + args = parser.parse_args(list(argv) if not argv is not None else None) try: return int(args.func(args))</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.35s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1384"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1384_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1384_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1384_1"><button class="btn btn-outline-success"><span class="job_id">1384 : Job ID c7e2b8b209d64a8ebffe3926c3542511</span></button></div></a><div aria-labelledby="job_list___sub_heading_1384_1" data-parent="#job_list___sub_accordion_1384" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1384_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=252" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (252, 3), end pos: (252, 25)</button></a></pre><pre>operator: core/AddNot, occurrence: 12</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -249,6 +249,6 @@ return 5 -if __name__ == "__main__": +if not __name__ == "__main__": raise SystemExit(main()) </pre></div><div class="alert alert-secondary"><pre class="diff">...F.......... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:228: in open request = self._request_from_builder_args(args, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:200: in _request_from_builder_args return builder.get_request() ^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:764: in get_request return cls(self.get_environ()) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:688: in get_environ input_stream, content_length, boundary = stream_encode_multipart( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:130: in stream_encode_multipart write_binary(encoder.send_event(Data(data=chunk, more_data=True))) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:81: in write_binary return stream.write(s) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... 1 failed, 13 passed, 22 warnings in 21.21s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1385"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1385_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1385_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1385_1"><button class="btn btn-outline-danger"><span class="job_id">1385 : Job ID 9ffeb87a9aaf49a4a67e3ff143946ed6</span></button></div></a><div aria-labelledby="job_list___sub_heading_1385_1" data-parent="#job_list___sub_accordion_1385" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1385_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=160" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (160, 48), end pos: (160, 52)</button></a></pre><pre>operator: core/ReplaceTrueWithFalse, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -157,7 +157,7 @@ ) p.add_argument("--version", action="version", version=f"pdfwm {__version__}") - sub = p.add_subparsers(dest="cmd", required=True) + sub = p.add_subparsers(dest="cmd", required=False) # methods p_methods = sub.add_parser("methods", help="List available watermarking methods")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.32s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1386"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1386_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1386_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1386_1"><button class="btn btn-outline-danger"><span class="job_id">1386 : Job ID 047e4ab30fe9466faca4adc00fb59533</span></button></div></a><div aria-labelledby="job_list___sub_heading_1386_1" data-parent="#job_list___sub_accordion_1386" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1386_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=104" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (104, 55), end pos: (104, 60)</button></a></pre><pre>operator: core/ReplaceFalseWithTrue, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -101,7 +101,7 @@ tree = explore_pdf(args.input) if args.out: with open(args.out, "w", encoding="utf-8") as fh: - json.dump(tree, fh, indent=2, ensure_ascii=False) + json.dump(tree, fh, indent=2, ensure_ascii=True) else: json.dump(tree, sys.stdout, indent=2, ensure_ascii=False) print()</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.62s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1387"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1387_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1387_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1387_1"><button class="btn btn-outline-danger"><span class="job_id">1387 : Job ID 8c89b927a64f42e48bd1feb1aa90c060</span></button></div></a><div aria-labelledby="job_list___sub_heading_1387_1" data-parent="#job_list___sub_accordion_1387" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1387_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=106" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (106, 59), end pos: (106, 64)</button></a></pre><pre>operator: core/ReplaceFalseWithTrue, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -103,7 +103,7 @@ with open(args.out, "w", encoding="utf-8") as fh: json.dump(tree, fh, indent=2, ensure_ascii=False) else: - json.dump(tree, sys.stdout, indent=2, ensure_ascii=False) + json.dump(tree, sys.stdout, indent=2, ensure_ascii=True) print() return 0 </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.24s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1388"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1388_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1388_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1388_1"><button class="btn btn-outline-success"><span class="job_id">1388 : Job ID ba681080029641b3a5a5d643ec5c8edc</span></button></div></a><div aria-labelledby="job_list___sub_heading_1388_1" data-parent="#job_list___sub_accordion_1388" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1388_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=235" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (235, 11), end pos: (235, 28)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -232,7 +232,7 @@ try: return int(args.func(args)) - except FileNotFoundError as e: + except CosmicRayTestingException as e: print(f"error: {e}", file=sys.stderr) return 2 except ValueError as e:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T034650863379Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T034651741610Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.40s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1389"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1389_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1389_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1389_1"><button class="btn btn-outline-success"><span class="job_id">1389 : Job ID 5def78fab127459899db2736bb2cbf7a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1389_1" data-parent="#job_list___sub_accordion_1389" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1389_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=238" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (238, 11), end pos: (238, 21)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -235,7 +235,7 @@ except FileNotFoundError as e: print(f"error: {e}", file=sys.stderr) return 2 - except ValueError as e: + except CosmicRayTestingException as e: print(f"error: {e}", file=sys.stderr) return 2 except SecretNotFoundError as e:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T171021023043Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T171021876828Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.20s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1390"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1390_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1390_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1390_1"><button class="btn btn-outline-danger"><span class="job_id">1390 : Job ID 8cbc88bb2b1f4c538c540340bcfa0cf1</span></button></div></a><div aria-labelledby="job_list___sub_heading_1390_1" data-parent="#job_list___sub_accordion_1390" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1390_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=241" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (241, 11), end pos: (241, 30)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -238,7 +238,7 @@ except ValueError as e: print(f"error: {e}", file=sys.stderr) return 2 - except SecretNotFoundError as e: + except CosmicRayTestingException as e: print(f"secret not found: {e}", file=sys.stderr) return 3 except InvalidKeyError as e:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.16s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1391"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1391_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1391_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1391_1"><button class="btn btn-outline-danger"><span class="job_id">1391 : Job ID 2b344dd1b6b14984a78b64346b552c2b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1391_1" data-parent="#job_list___sub_accordion_1391" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1391_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=244" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (244, 11), end pos: (244, 26)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -241,7 +241,7 @@ except SecretNotFoundError as e: print(f"secret not found: {e}", file=sys.stderr) return 3 - except InvalidKeyError as e: + except CosmicRayTestingException as e: print(f"invalid key: {e}", file=sys.stderr) return 4 except WatermarkingError as e:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.95s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1392"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1392_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1392_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1392_1"><button class="btn btn-outline-danger"><span class="job_id">1392 : Job ID bdb51cf8826544cd86261dcf50a6e03f</span></button></div></a><div aria-labelledby="job_list___sub_heading_1392_1" data-parent="#job_list___sub_accordion_1392" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1392_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=247" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (247, 11), end pos: (247, 28)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -244,7 +244,7 @@ except InvalidKeyError as e: print(f"invalid key: {e}", file=sys.stderr) return 4 - except WatermarkingError as e: + except CosmicRayTestingException as e: print(f"watermarking error: {e}", file=sys.stderr) return 5 </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.19s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1393"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1393_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1393_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1393_1"><button class="btn btn-outline-success"><span class="job_id">1393 : Job ID d2e0c1a60ea144cf8614dcedf43743d9</span></button></div></a><div aria-labelledby="job_list___sub_heading_1393_1" data-parent="#job_list___sub_accordion_1393" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1393_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=97" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (97, 11), end pos: (97, 12)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -94,7 +94,7 @@ def cmd_methods(_args: argparse.Namespace) -&gt; int: for name in sorted(METHODS): print(name) - return 0 + return 1 def cmd_explore(args: argparse.Namespace) -&gt; int:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T053840391953Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T053841236752Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.34s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1394"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1394_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1394_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1394_1"><button class="btn btn-outline-danger"><span class="job_id">1394 : Job ID 58f9c48e37354062861fa0f5cbff846a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1394_1" data-parent="#job_list___sub_accordion_1394" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1394_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=97" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (97, 11), end pos: (97, 12)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -94,7 +94,7 @@ def cmd_methods(_args: argparse.Namespace) -&gt; int: for name in sorted(METHODS): print(name) - return 0 + return -1 def cmd_explore(args: argparse.Namespace) -&gt; int:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.86s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1395"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1395_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1395_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1395_1"><button class="btn btn-outline-danger"><span class="job_id">1395 : Job ID bc7567f3d34d4e92a1f251372788b10c</span></button></div></a><div aria-labelledby="job_list___sub_heading_1395_1" data-parent="#job_list___sub_accordion_1395" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1395_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=104" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (104, 39), end pos: (104, 40)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -101,7 +101,7 @@ tree = explore_pdf(args.input) if args.out: with open(args.out, "w", encoding="utf-8") as fh: - json.dump(tree, fh, indent=2, ensure_ascii=False) + json.dump(tree, fh, indent= 3, ensure_ascii=False) else: json.dump(tree, sys.stdout, indent=2, ensure_ascii=False) print()</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.28s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1396"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1396_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1396_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1396_1"><button class="btn btn-outline-danger"><span class="job_id">1396 : Job ID d6dd21efeee14a529184bf0290d8007e</span></button></div></a><div aria-labelledby="job_list___sub_heading_1396_1" data-parent="#job_list___sub_accordion_1396" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1396_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=104" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (104, 39), end pos: (104, 40)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -101,7 +101,7 @@ tree = explore_pdf(args.input) if args.out: with open(args.out, "w", encoding="utf-8") as fh: - json.dump(tree, fh, indent=2, ensure_ascii=False) + json.dump(tree, fh, indent= 1, ensure_ascii=False) else: json.dump(tree, sys.stdout, indent=2, ensure_ascii=False) print()</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.94s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1397"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1397_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1397_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1397_1"><button class="btn btn-outline-danger"><span class="job_id">1397 : Job ID f649a4294dff45c7a190e904bf038ced</span></button></div></a><div aria-labelledby="job_list___sub_heading_1397_1" data-parent="#job_list___sub_accordion_1397" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1397_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=106" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (106, 43), end pos: (106, 44)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -103,7 +103,7 @@ with open(args.out, "w", encoding="utf-8") as fh: json.dump(tree, fh, indent=2, ensure_ascii=False) else: - json.dump(tree, sys.stdout, indent=2, ensure_ascii=False) + json.dump(tree, sys.stdout, indent= 3, ensure_ascii=False) print() return 0 </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.15s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1398"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1398_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1398_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1398_1"><button class="btn btn-outline-danger"><span class="job_id">1398 : Job ID 9fce9a797efc490daa283dde2f61e787</span></button></div></a><div aria-labelledby="job_list___sub_heading_1398_1" data-parent="#job_list___sub_accordion_1398" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1398_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=106" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (106, 43), end pos: (106, 44)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -103,7 +103,7 @@ with open(args.out, "w", encoding="utf-8") as fh: json.dump(tree, fh, indent=2, ensure_ascii=False) else: - json.dump(tree, sys.stdout, indent=2, ensure_ascii=False) + json.dump(tree, sys.stdout, indent= 1, ensure_ascii=False) print() return 0 </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.35s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1399"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1399_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1399_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1399_1"><button class="btn btn-outline-success"><span class="job_id">1399 : Job ID 270dd6bb47c64c20b4a5af774ec18b24</span></button></div></a><div aria-labelledby="job_list___sub_heading_1399_1" data-parent="#job_list___sub_accordion_1399" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1399_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=108" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (108, 11), end pos: (108, 12)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -105,7 +105,7 @@ else: json.dump(tree, sys.stdout, indent=2, ensure_ascii=False) print() - return 0 + return 1 def cmd_embed(args: argparse.Namespace) -&gt; int:</pre></div><div class="alert alert-secondary"><pre class="diff">...F.......... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:228: in open request = self._request_from_builder_args(args, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:200: in _request_from_builder_args return builder.get_request() ^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:764: in get_request return cls(self.get_environ()) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:688: in get_environ input_stream, content_length, boundary = stream_encode_multipart( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:130: in stream_encode_multipart write_binary(encoder.send_event(Data(data=chunk, more_data=True))) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:81: in write_binary return stream.write(s) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... 1 failed, 13 passed, 22 warnings in 20.67s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1400"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1400_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1400_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1400_1"><button class="btn btn-outline-danger"><span class="job_id">1400 : Job ID ffb58de8e221457daf4cf4db78cefddc</span></button></div></a><div aria-labelledby="job_list___sub_heading_1400_1" data-parent="#job_list___sub_accordion_1400" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1400_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=108" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (108, 11), end pos: (108, 12)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -105,7 +105,7 @@ else: json.dump(tree, sys.stdout, indent=2, ensure_ascii=False) print() - return 0 + return -1 def cmd_embed(args: argparse.Namespace) -&gt; int:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.49s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1401"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1401_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1401_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1401_1"><button class="btn btn-outline-danger"><span class="job_id">1401 : Job ID a4b0de4762c34d039c21571bbe4438d5</span></button></div></a><div aria-labelledby="job_list___sub_heading_1401_1" data-parent="#job_list___sub_accordion_1401" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1401_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=121" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (121, 15), end pos: (121, 16)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 8</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -118,7 +118,7 @@ f"Method {args.method} is not applicable on {args.output} at " f"{args.position}." ) - return 5 + return 6 pdf_bytes = apply_watermark( method=args.method,</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.69s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1402"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1402_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1402_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1402_1"><button class="btn btn-outline-danger"><span class="job_id">1402 : Job ID 8ebb12f0b0ae42bebb7c5eb3bb045c16</span></button></div></a><div aria-labelledby="job_list___sub_heading_1402_1" data-parent="#job_list___sub_accordion_1402" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1402_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=121" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (121, 15), end pos: (121, 16)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 9</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -118,7 +118,7 @@ f"Method {args.method} is not applicable on {args.output} at " f"{args.position}." ) - return 5 + return 4 pdf_bytes = apply_watermark( method=args.method,</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.56s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1403"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1403_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1403_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1403_1"><button class="btn btn-outline-danger"><span class="job_id">1403 : Job ID 2d4496e046ee41488b60670a5abc870c</span></button></div></a><div aria-labelledby="job_list___sub_heading_1403_1" data-parent="#job_list___sub_accordion_1403" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1403_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=134" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (134, 11), end pos: (134, 12)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 10</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -131,7 +131,7 @@ with open(args.output, "wb") as fh: fh.write(pdf_bytes) print(f"Wrote watermarked PDF -&gt; {args.output}") - return 0 + return 1 def cmd_extract(args: argparse.Namespace) -&gt; int:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.25s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1404"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1404_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1404_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1404_1"><button class="btn btn-outline-success"><span class="job_id">1404 : Job ID bf8a884661b94dd9b15a1c10babe9f96</span></button></div></a><div aria-labelledby="job_list___sub_heading_1404_1" data-parent="#job_list___sub_accordion_1404" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1404_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=134" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (134, 11), end pos: (134, 12)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 11</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -131,7 +131,7 @@ with open(args.output, "wb") as fh: fh.write(pdf_bytes) print(f"Wrote watermarked PDF -&gt; {args.output}") - return 0 + return -1 def cmd_extract(args: argparse.Namespace) -&gt; int:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T190615310646Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T190616211378Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.73s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1405"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1405_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1405_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1405_1"><button class="btn btn-outline-success"><span class="job_id">1405 : Job ID 1d9e148d07af498ca086682532ae4de3</span></button></div></a><div aria-labelledby="job_list___sub_heading_1405_1" data-parent="#job_list___sub_accordion_1405" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1405_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=146" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (146, 11), end pos: (146, 12)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 12</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -143,7 +143,7 @@ print(f"Wrote secret -&gt; {args.out}") else: print(secret) - return 0 + return 1 # --------------------</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ee40cb4752147eb07: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.58s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1406"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1406_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1406_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1406_1"><button class="btn btn-outline-danger"><span class="job_id">1406 : Job ID b306f18c80a946cba13e215d4c6c1cd8</span></button></div></a><div aria-labelledby="job_list___sub_heading_1406_1" data-parent="#job_list___sub_accordion_1406" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1406_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=146" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (146, 11), end pos: (146, 12)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 13</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -143,7 +143,7 @@ print(f"Wrote secret -&gt; {args.out}") else: print(secret) - return 0 + return -1 # --------------------</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.92s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1407"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1407_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1407_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1407_1"><button class="btn btn-outline-danger"><span class="job_id">1407 : Job ID 5e9ad013ca0d44bf87336cef22c167f8</span></button></div></a><div aria-labelledby="job_list___sub_heading_1407_1" data-parent="#job_list___sub_accordion_1407" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1407_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=237" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (237, 15), end pos: (237, 16)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 14</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -234,7 +234,7 @@ return int(args.func(args)) except FileNotFoundError as e: print(f"error: {e}", file=sys.stderr) - return 2 + return 3 except ValueError as e: print(f"error: {e}", file=sys.stderr) return 2</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.51s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1408"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1408_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1408_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1408_1"><button class="btn btn-outline-success"><span class="job_id">1408 : Job ID 7d73acc406a040089875c8746c96869a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1408_1" data-parent="#job_list___sub_accordion_1408" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1408_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=237" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (237, 15), end pos: (237, 16)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 15</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -234,7 +234,7 @@ return int(args.func(args)) except FileNotFoundError as e: print(f"error: {e}", file=sys.stderr) - return 2 + return 1 except ValueError as e: print(f"error: {e}", file=sys.stderr) return 2</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T012803602745Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T012804514727Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.24s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1409"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1409_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1409_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1409_1"><button class="btn btn-outline-danger"><span class="job_id">1409 : Job ID 76e9c12c7da646ff9cd9f7114f6a893f</span></button></div></a><div aria-labelledby="job_list___sub_heading_1409_1" data-parent="#job_list___sub_accordion_1409" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1409_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=240" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (240, 15), end pos: (240, 16)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 16</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -237,7 +237,7 @@ return 2 except ValueError as e: print(f"error: {e}", file=sys.stderr) - return 2 + return 3 except SecretNotFoundError as e: print(f"secret not found: {e}", file=sys.stderr) return 3</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.20s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1410"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1410_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1410_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1410_1"><button class="btn btn-outline-danger"><span class="job_id">1410 : Job ID 31a88b2fe704443eab9a74d2243806b2</span></button></div></a><div aria-labelledby="job_list___sub_heading_1410_1" data-parent="#job_list___sub_accordion_1410" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1410_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=240" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (240, 15), end pos: (240, 16)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 17</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -237,7 +237,7 @@ return 2 except ValueError as e: print(f"error: {e}", file=sys.stderr) - return 2 + return 1 except SecretNotFoundError as e: print(f"secret not found: {e}", file=sys.stderr) return 3</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.71s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1411"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1411_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1411_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1411_1"><button class="btn btn-outline-success"><span class="job_id">1411 : Job ID df6ce5dd7da54c388ecc33c3d917861f</span></button></div></a><div aria-labelledby="job_list___sub_heading_1411_1" data-parent="#job_list___sub_accordion_1411" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1411_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=243" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (243, 15), end pos: (243, 16)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 18</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -240,7 +240,7 @@ return 2 except SecretNotFoundError as e: print(f"secret not found: {e}", file=sys.stderr) - return 3 + return 4 except InvalidKeyError as e: print(f"invalid key: {e}", file=sys.stderr) return 4</pre></div><div class="alert alert-secondary"><pre class="diff">...F.......... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:831: in write self._check(file) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:699: in _check self.rollover() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:711: in rollover newfile.write(file.getvalue()) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'%PDF-1.4\n000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... 1 failed, 13 passed, 22 warnings in 20.28s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1412"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1412_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1412_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1412_1"><button class="btn btn-outline-danger"><span class="job_id">1412 : Job ID b105b7b7106b4e92ab5ba83a19768ac7</span></button></div></a><div aria-labelledby="job_list___sub_heading_1412_1" data-parent="#job_list___sub_accordion_1412" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1412_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=243" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (243, 15), end pos: (243, 16)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 19</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -240,7 +240,7 @@ return 2 except SecretNotFoundError as e: print(f"secret not found: {e}", file=sys.stderr) - return 3 + return 2 except InvalidKeyError as e: print(f"invalid key: {e}", file=sys.stderr) return 4</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.68s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1413"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1413_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1413_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1413_1"><button class="btn btn-outline-success"><span class="job_id">1413 : Job ID 1acf5639fe0d47f0a25a4d7cb6146ea3</span></button></div></a><div aria-labelledby="job_list___sub_heading_1413_1" data-parent="#job_list___sub_accordion_1413" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1413_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=246" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (246, 15), end pos: (246, 16)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 20</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -243,7 +243,7 @@ return 3 except InvalidKeyError as e: print(f"invalid key: {e}", file=sys.stderr) - return 4 + return 5 except WatermarkingError as e: print(f"watermarking error: {e}", file=sys.stderr) return 5</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e455c83066fde8c3e: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 20.31s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1414"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1414_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1414_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1414_1"><button class="btn btn-outline-danger"><span class="job_id">1414 : Job ID 99317bb858d64f58b139e5fcd73fcb06</span></button></div></a><div aria-labelledby="job_list___sub_heading_1414_1" data-parent="#job_list___sub_accordion_1414" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1414_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=246" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (246, 15), end pos: (246, 16)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 21</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -243,7 +243,7 @@ return 3 except InvalidKeyError as e: print(f"invalid key: {e}", file=sys.stderr) - return 4 + return 3 except WatermarkingError as e: print(f"watermarking error: {e}", file=sys.stderr) return 5</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.15s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1415"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1415_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1415_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1415_1"><button class="btn btn-outline-success"><span class="job_id">1415 : Job ID 4985e152ce8649e0931751a98747c1c3</span></button></div></a><div aria-labelledby="job_list___sub_heading_1415_1" data-parent="#job_list___sub_accordion_1415" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1415_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=249" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (249, 15), end pos: (249, 16)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 22</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -246,7 +246,7 @@ return 4 except WatermarkingError as e: print(f"watermarking error: {e}", file=sys.stderr) - return 5 + return 6 if __name__ == "__main__":</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T050813628741Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T050814608518Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 20.64s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1416"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1416_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1416_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1416_1"><button class="btn btn-outline-danger"><span class="job_id">1416 : Job ID 8e71b679a48b4c0badf99c0f88537420</span></button></div></a><div aria-labelledby="job_list___sub_heading_1416_1" data-parent="#job_list___sub_accordion_1416" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1416_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=249" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (249, 15), end pos: (249, 16)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 23</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -246,7 +246,7 @@ return 4 except WatermarkingError as e: print(f"watermarking error: {e}", file=sys.stderr) - return 5 + return 4 if __name__ == "__main__":</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.42s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1417"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1417_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1417_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1417_1"><button class="btn btn-outline-danger"><span class="job_id">1417 : Job ID f768a1ec399c4f3d9de6150e60a6ceb4</span></button></div></a><div aria-labelledby="job_list___sub_heading_1417_1" data-parent="#job_list___sub_accordion_1417" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1417_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_cli.py&amp;line=95" class="text-secondary"><button class="btn btn-outline-dark">watermarking_cli.py, start pos: (95, 16), end pos: (95, 31)</button></a></pre><pre>operator: core/ZeroIterationForLoop, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_cli.py +++ bwatermarking_cli.py @@ -92,7 +92,7 @@ def cmd_methods(_args: argparse.Namespace) -&gt; int: - for name in sorted(METHODS): + for name in []: print(name) return 0 </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.35s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1418"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1418_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1418_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1418_1"><button class="btn btn-outline-danger"><span class="job_id">1418 : Job ID 3fba9acd3f974f4280f14ec8331fa870</span></button></div></a><div aria-labelledby="job_list___sub_heading_1418_1" data-parent="#job_list___sub_accordion_1418" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1418_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=299" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (299, 57), end pos: (299, 58)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Sub, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -296,7 +296,7 @@ try: # Shrink rectangle to a tiny box r = annot.rect - tiny = pymupdf.Rect(r.x0, r.y1 - 2, r.x0 + 2, r.y1) + tiny = pymupdf.Rect(r.x0, r.y1 - 2, r.x0 - 2, r.y1) annot.set_rect(tiny) except Exception as exc: logger.debug("Shrinking annotation rect failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.93s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1419"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1419_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1419_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1419_1"><button class="btn btn-outline-danger"><span class="job_id">1419 : Job ID a1e4ab367d084774b006635638d789a4</span></button></div></a><div aria-labelledby="job_list___sub_heading_1419_1" data-parent="#job_list___sub_accordion_1419" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1419_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=299" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (299, 57), end pos: (299, 58)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Mul, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -296,7 +296,7 @@ try: # Shrink rectangle to a tiny box r = annot.rect - tiny = pymupdf.Rect(r.x0, r.y1 - 2, r.x0 + 2, r.y1) + tiny = pymupdf.Rect(r.x0, r.y1 - 2, r.x0 * 2, r.y1) annot.set_rect(tiny) except Exception as exc: logger.debug("Shrinking annotation rect failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.93s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1420"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1420_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1420_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1420_1"><button class="btn btn-outline-danger"><span class="job_id">1420 : Job ID d777f1fe203a409cb2adb14b9eb00cec</span></button></div></a><div aria-labelledby="job_list___sub_heading_1420_1" data-parent="#job_list___sub_accordion_1420" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1420_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=299" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (299, 57), end pos: (299, 58)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Div, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -296,7 +296,7 @@ try: # Shrink rectangle to a tiny box r = annot.rect - tiny = pymupdf.Rect(r.x0, r.y1 - 2, r.x0 + 2, r.y1) + tiny = pymupdf.Rect(r.x0, r.y1 - 2, r.x0 / 2, r.y1) annot.set_rect(tiny) except Exception as exc: logger.debug("Shrinking annotation rect failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.59s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1421"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1421_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1421_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1421_1"><button class="btn btn-outline-success"><span class="job_id">1421 : Job ID 1d280593930d4ebcbf82295ea9771ab9</span></button></div></a><div aria-labelledby="job_list___sub_heading_1421_1" data-parent="#job_list___sub_accordion_1421" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1421_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=299" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (299, 57), end pos: (299, 58)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_FloorDiv, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -296,7 +296,7 @@ try: # Shrink rectangle to a tiny box r = annot.rect - tiny = pymupdf.Rect(r.x0, r.y1 - 2, r.x0 + 2, r.y1) + tiny = pymupdf.Rect(r.x0, r.y1 - 2, r.x0 // 2, r.y1) annot.set_rect(tiny) except Exception as exc: logger.debug("Shrinking annotation rect failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">...F.........F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:831: in write self._check(file) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:699: in _check self.rollover() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:711: in rollover newfile.write(file.getvalue()) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'%PDF-1.4\n000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e190bbba64e62d682: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 2 failed, 12 passed, 22 warnings in 20.64s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1422"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1422_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1422_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1422_1"><button class="btn btn-outline-success"><span class="job_id">1422 : Job ID eb8534a170574f19a6a47389172baf58</span></button></div></a><div aria-labelledby="job_list___sub_heading_1422_1" data-parent="#job_list___sub_accordion_1422" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1422_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=299" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (299, 57), end pos: (299, 58)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Mod, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -296,7 +296,7 @@ try: # Shrink rectangle to a tiny box r = annot.rect - tiny = pymupdf.Rect(r.x0, r.y1 - 2, r.x0 + 2, r.y1) + tiny = pymupdf.Rect(r.x0, r.y1 - 2, r.x0 % 2, r.y1) annot.set_rect(tiny) except Exception as exc: logger.debug("Shrinking annotation rect failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T200116853357Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T200117837307Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.70s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1423"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1423_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1423_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1423_1"><button class="btn btn-outline-success"><span class="job_id">1423 : Job ID d4eb590df67d4e6da56c0f16fcc59eef</span></button></div></a><div aria-labelledby="job_list___sub_heading_1423_1" data-parent="#job_list___sub_accordion_1423" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1423_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=299" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (299, 57), end pos: (299, 58)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Pow, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -296,7 +296,7 @@ try: # Shrink rectangle to a tiny box r = annot.rect - tiny = pymupdf.Rect(r.x0, r.y1 - 2, r.x0 + 2, r.y1) + tiny = pymupdf.Rect(r.x0, r.y1 - 2, r.x0 ** 2, r.y1) annot.set_rect(tiny) except Exception as exc: logger.debug("Shrinking annotation rect failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T151528613298Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T151529465727Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.29s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1424"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1424_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1424_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1424_1"><button class="btn btn-outline-danger"><span class="job_id">1424 : Job ID 45684d0fe0c54ce19a5ee3aa02ae140a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1424_1" data-parent="#job_list___sub_accordion_1424" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1424_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=299" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (299, 57), end pos: (299, 58)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_RShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -296,7 +296,7 @@ try: # Shrink rectangle to a tiny box r = annot.rect - tiny = pymupdf.Rect(r.x0, r.y1 - 2, r.x0 + 2, r.y1) + tiny = pymupdf.Rect(r.x0, r.y1 - 2, r.x0 &gt;&gt; 2, r.y1) annot.set_rect(tiny) except Exception as exc: logger.debug("Shrinking annotation rect failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.24s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1425"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1425_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1425_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1425_1"><button class="btn btn-outline-success"><span class="job_id">1425 : Job ID 2099a0db2bd745bca64bb435a52009f4</span></button></div></a><div aria-labelledby="job_list___sub_heading_1425_1" data-parent="#job_list___sub_accordion_1425" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1425_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=299" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (299, 57), end pos: (299, 58)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_LShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -296,7 +296,7 @@ try: # Shrink rectangle to a tiny box r = annot.rect - tiny = pymupdf.Rect(r.x0, r.y1 - 2, r.x0 + 2, r.y1) + tiny = pymupdf.Rect(r.x0, r.y1 - 2, r.x0 &lt;&lt; 2, r.y1) annot.set_rect(tiny) except Exception as exc: logger.debug("Shrinking annotation rect failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">...F.......... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:228: in open request = self._request_from_builder_args(args, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:200: in _request_from_builder_args return builder.get_request() ^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:764: in get_request return cls(self.get_environ()) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:688: in get_environ input_stream, content_length, boundary = stream_encode_multipart( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:130: in stream_encode_multipart write_binary(encoder.send_event(Data(data=chunk, more_data=True))) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:81: in write_binary return stream.write(s) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... 1 failed, 13 passed, 22 warnings in 21.44s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1426"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1426_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1426_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1426_1"><button class="btn btn-outline-danger"><span class="job_id">1426 : Job ID dab6745691544146a8559fca970d9e1b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1426_1" data-parent="#job_list___sub_accordion_1426" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1426_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=299" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (299, 57), end pos: (299, 58)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitOr, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -296,7 +296,7 @@ try: # Shrink rectangle to a tiny box r = annot.rect - tiny = pymupdf.Rect(r.x0, r.y1 - 2, r.x0 + 2, r.y1) + tiny = pymupdf.Rect(r.x0, r.y1 - 2, r.x0 | 2, r.y1) annot.set_rect(tiny) except Exception as exc: logger.debug("Shrinking annotation rect failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.01s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1427"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1427_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1427_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1427_1"><button class="btn btn-outline-danger"><span class="job_id">1427 : Job ID c006e72c3c5f4a7fb6690dfcd03f95bc</span></button></div></a><div aria-labelledby="job_list___sub_heading_1427_1" data-parent="#job_list___sub_accordion_1427" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1427_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=299" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (299, 57), end pos: (299, 58)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitAnd, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -296,7 +296,7 @@ try: # Shrink rectangle to a tiny box r = annot.rect - tiny = pymupdf.Rect(r.x0, r.y1 - 2, r.x0 + 2, r.y1) + tiny = pymupdf.Rect(r.x0, r.y1 - 2, r.x0 &amp; 2, r.y1) annot.set_rect(tiny) except Exception as exc: logger.debug("Shrinking annotation rect failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.33s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1428"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1428_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1428_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1428_1"><button class="btn btn-outline-success"><span class="job_id">1428 : Job ID cd5c105cba1f4acbb462ad8a0fc201a1</span></button></div></a><div aria-labelledby="job_list___sub_heading_1428_1" data-parent="#job_list___sub_accordion_1428" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1428_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=299" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (299, 57), end pos: (299, 58)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitXor, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -296,7 +296,7 @@ try: # Shrink rectangle to a tiny box r = annot.rect - tiny = pymupdf.Rect(r.x0, r.y1 - 2, r.x0 + 2, r.y1) + tiny = pymupdf.Rect(r.x0, r.y1 - 2, r.x0 ^ 2, r.y1) annot.set_rect(tiny) except Exception as exc: logger.debug("Shrinking annotation rect failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ea44c4bc56465765c: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.79s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1429"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1429_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1429_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1429_1"><button class="btn btn-outline-danger"><span class="job_id">1429 : Job ID 6f489e08749b433d933a7eef231f9670</span></button></div></a><div aria-labelledby="job_list___sub_heading_1429_1" data-parent="#job_list___sub_accordion_1429" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1429_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=278" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (278, 49), end pos: (278, 50)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_Add, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -275,7 +275,7 @@ page = doc.load_page(0) # Place near top-left (PDF origin is bottom-left) margin = 2 - tl_point = (margin, page.rect.height - margin) + tl_point = (margin, page.rect.height + margin) annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.43s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1430"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1430_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1430_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1430_1"><button class="btn btn-outline-danger"><span class="job_id">1430 : Job ID 128c726ac8b244ebb6ea912cba29f4b6</span></button></div></a><div aria-labelledby="job_list___sub_heading_1430_1" data-parent="#job_list___sub_accordion_1430" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1430_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=299" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (299, 47), end pos: (299, 48)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_Add, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -296,7 +296,7 @@ try: # Shrink rectangle to a tiny box r = annot.rect - tiny = pymupdf.Rect(r.x0, r.y1 - 2, r.x0 + 2, r.y1) + tiny = pymupdf.Rect(r.x0, r.y1 + 2, r.x0 + 2, r.y1) annot.set_rect(tiny) except Exception as exc: logger.debug("Shrinking annotation rect failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.44s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1431"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1431_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1431_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1431_1"><button class="btn btn-outline-danger"><span class="job_id">1431 : Job ID cad55a87a80349f482870699288237c5</span></button></div></a><div aria-labelledby="job_list___sub_heading_1431_1" data-parent="#job_list___sub_accordion_1431" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1431_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=278" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (278, 49), end pos: (278, 50)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_Mul, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -275,7 +275,7 @@ page = doc.load_page(0) # Place near top-left (PDF origin is bottom-left) margin = 2 - tl_point = (margin, page.rect.height - margin) + tl_point = (margin, page.rect.height * margin) annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.33s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1432"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1432_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1432_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1432_1"><button class="btn btn-outline-success"><span class="job_id">1432 : Job ID f1fe30bcf2914e68bb8b155dc457ea12</span></button></div></a><div aria-labelledby="job_list___sub_heading_1432_1" data-parent="#job_list___sub_accordion_1432" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1432_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=299" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (299, 47), end pos: (299, 48)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_Mul, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -296,7 +296,7 @@ try: # Shrink rectangle to a tiny box r = annot.rect - tiny = pymupdf.Rect(r.x0, r.y1 - 2, r.x0 + 2, r.y1) + tiny = pymupdf.Rect(r.x0, r.y1 * 2, r.x0 + 2, r.y1) annot.set_rect(tiny) except Exception as exc: logger.debug("Shrinking annotation rect failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T180349727522Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T180351128557Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 23.01s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1433"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1433_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1433_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1433_1"><button class="btn btn-outline-danger"><span class="job_id">1433 : Job ID 0f0f4c2cdb564d8bb698194a012b47a7</span></button></div></a><div aria-labelledby="job_list___sub_heading_1433_1" data-parent="#job_list___sub_accordion_1433" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1433_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=278" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (278, 49), end pos: (278, 50)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_Div, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -275,7 +275,7 @@ page = doc.load_page(0) # Place near top-left (PDF origin is bottom-left) margin = 2 - tl_point = (margin, page.rect.height - margin) + tl_point = (margin, page.rect.height / margin) annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.13s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1434"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1434_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1434_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1434_1"><button class="btn btn-outline-danger"><span class="job_id">1434 : Job ID d5a534953b6b4f8da5343f0ca0260fb1</span></button></div></a><div aria-labelledby="job_list___sub_heading_1434_1" data-parent="#job_list___sub_accordion_1434" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1434_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=299" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (299, 47), end pos: (299, 48)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_Div, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -296,7 +296,7 @@ try: # Shrink rectangle to a tiny box r = annot.rect - tiny = pymupdf.Rect(r.x0, r.y1 - 2, r.x0 + 2, r.y1) + tiny = pymupdf.Rect(r.x0, r.y1 / 2, r.x0 + 2, r.y1) annot.set_rect(tiny) except Exception as exc: logger.debug("Shrinking annotation rect failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.35s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1435"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1435_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1435_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1435_1"><button class="btn btn-outline-danger"><span class="job_id">1435 : Job ID c0dc9a2b580b471580fbfe1c3692bfd2</span></button></div></a><div aria-labelledby="job_list___sub_heading_1435_1" data-parent="#job_list___sub_accordion_1435" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1435_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=278" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (278, 49), end pos: (278, 50)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_FloorDiv, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -275,7 +275,7 @@ page = doc.load_page(0) # Place near top-left (PDF origin is bottom-left) margin = 2 - tl_point = (margin, page.rect.height - margin) + tl_point = (margin, page.rect.height // margin) annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.36s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1436"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1436_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1436_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1436_1"><button class="btn btn-outline-success"><span class="job_id">1436 : Job ID 193f0a82fe794a508d2d61fd5beb9600</span></button></div></a><div aria-labelledby="job_list___sub_heading_1436_1" data-parent="#job_list___sub_accordion_1436" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1436_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=299" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (299, 47), end pos: (299, 48)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_FloorDiv, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -296,7 +296,7 @@ try: # Shrink rectangle to a tiny box r = annot.rect - tiny = pymupdf.Rect(r.x0, r.y1 - 2, r.x0 + 2, r.y1) + tiny = pymupdf.Rect(r.x0, r.y1 // 2, r.x0 + 2, r.y1) annot.set_rect(tiny) except Exception as exc: logger.debug("Shrinking annotation rect failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T051806581502Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T051807499538Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 20.05s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1437"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1437_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1437_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1437_1"><button class="btn btn-outline-danger"><span class="job_id">1437 : Job ID f28a51bf46dc495c9ac05df9b7fa5c20</span></button></div></a><div aria-labelledby="job_list___sub_heading_1437_1" data-parent="#job_list___sub_accordion_1437" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1437_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=278" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (278, 49), end pos: (278, 50)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_Mod, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -275,7 +275,7 @@ page = doc.load_page(0) # Place near top-left (PDF origin is bottom-left) margin = 2 - tl_point = (margin, page.rect.height - margin) + tl_point = (margin, page.rect.height % margin) annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.48s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1438"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1438_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1438_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1438_1"><button class="btn btn-outline-success"><span class="job_id">1438 : Job ID fc112f0d1b0c4e1ba27b84608c277684</span></button></div></a><div aria-labelledby="job_list___sub_heading_1438_1" data-parent="#job_list___sub_accordion_1438" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1438_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=299" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (299, 47), end pos: (299, 48)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_Mod, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -296,7 +296,7 @@ try: # Shrink rectangle to a tiny box r = annot.rect - tiny = pymupdf.Rect(r.x0, r.y1 - 2, r.x0 + 2, r.y1) + tiny = pymupdf.Rect(r.x0, r.y1 % 2, r.x0 + 2, r.y1) annot.set_rect(tiny) except Exception as exc: logger.debug("Shrinking annotation rect failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T142640129689Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T142641045988Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 20.41s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1439"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1439_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1439_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1439_1"><button class="btn btn-outline-danger"><span class="job_id">1439 : Job ID 9f1b605913d047e5abb7e0991e2f00ab</span></button></div></a><div aria-labelledby="job_list___sub_heading_1439_1" data-parent="#job_list___sub_accordion_1439" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1439_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=278" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (278, 49), end pos: (278, 50)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_Pow, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -275,7 +275,7 @@ page = doc.load_page(0) # Place near top-left (PDF origin is bottom-left) margin = 2 - tl_point = (margin, page.rect.height - margin) + tl_point = (margin, page.rect.height ** margin) annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.30s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1440"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1440_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1440_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1440_1"><button class="btn btn-outline-success"><span class="job_id">1440 : Job ID 9fc6ff0b21614647adac21d1bdd91e31</span></button></div></a><div aria-labelledby="job_list___sub_heading_1440_1" data-parent="#job_list___sub_accordion_1440" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1440_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=299" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (299, 47), end pos: (299, 48)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_Pow, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -296,7 +296,7 @@ try: # Shrink rectangle to a tiny box r = annot.rect - tiny = pymupdf.Rect(r.x0, r.y1 - 2, r.x0 + 2, r.y1) + tiny = pymupdf.Rect(r.x0, r.y1 ** 2, r.x0 + 2, r.y1) annot.set_rect(tiny) except Exception as exc: logger.debug("Shrinking annotation rect failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....F...F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ecf27e5128d6e01df: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 3 failed, 11 passed, 22 warnings in 20.32s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1441"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1441_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1441_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1441_1"><button class="btn btn-outline-danger"><span class="job_id">1441 : Job ID 95db7d162a8243f8bc775b1cac9216c0</span></button></div></a><div aria-labelledby="job_list___sub_heading_1441_1" data-parent="#job_list___sub_accordion_1441" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1441_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=278" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (278, 49), end pos: (278, 50)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_RShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -275,7 +275,7 @@ page = doc.load_page(0) # Place near top-left (PDF origin is bottom-left) margin = 2 - tl_point = (margin, page.rect.height - margin) + tl_point = (margin, page.rect.height &gt;&gt; margin) annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.37s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1442"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1442_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1442_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1442_1"><button class="btn btn-outline-danger"><span class="job_id">1442 : Job ID 33f661a5b8144ea4a2ffe3011d17f2b3</span></button></div></a><div aria-labelledby="job_list___sub_heading_1442_1" data-parent="#job_list___sub_accordion_1442" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1442_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=299" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (299, 47), end pos: (299, 48)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_RShift, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -296,7 +296,7 @@ try: # Shrink rectangle to a tiny box r = annot.rect - tiny = pymupdf.Rect(r.x0, r.y1 - 2, r.x0 + 2, r.y1) + tiny = pymupdf.Rect(r.x0, r.y1 &gt;&gt; 2, r.x0 + 2, r.y1) annot.set_rect(tiny) except Exception as exc: logger.debug("Shrinking annotation rect failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.96s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1443"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1443_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1443_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1443_1"><button class="btn btn-outline-success"><span class="job_id">1443 : Job ID 1c8031baa752463ca62257cbad88535a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1443_1" data-parent="#job_list___sub_accordion_1443" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1443_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=278" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (278, 49), end pos: (278, 50)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_LShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -275,7 +275,7 @@ page = doc.load_page(0) # Place near top-left (PDF origin is bottom-left) margin = 2 - tl_point = (margin, page.rect.height - margin) + tl_point = (margin, page.rect.height &lt;&lt; margin) annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T001218728743Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T001219607992Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.21s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1444"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1444_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1444_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1444_1"><button class="btn btn-outline-success"><span class="job_id">1444 : Job ID 6f7b37e32dae473992217d48fb59bc2a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1444_1" data-parent="#job_list___sub_accordion_1444" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1444_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=299" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (299, 47), end pos: (299, 48)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_LShift, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -296,7 +296,7 @@ try: # Shrink rectangle to a tiny box r = annot.rect - tiny = pymupdf.Rect(r.x0, r.y1 - 2, r.x0 + 2, r.y1) + tiny = pymupdf.Rect(r.x0, r.y1 &lt;&lt; 2, r.x0 + 2, r.y1) annot.set_rect(tiny) except Exception as exc: logger.debug("Shrinking annotation rect failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T003738963433Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T003739880084Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.19s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1445"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1445_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1445_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1445_1"><button class="btn btn-outline-success"><span class="job_id">1445 : Job ID dd223f63f78143c4a91a56c405c1cf35</span></button></div></a><div aria-labelledby="job_list___sub_heading_1445_1" data-parent="#job_list___sub_accordion_1445" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1445_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=278" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (278, 49), end pos: (278, 50)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_BitOr, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -275,7 +275,7 @@ page = doc.load_page(0) # Place near top-left (PDF origin is bottom-left) margin = 2 - tl_point = (margin, page.rect.height - margin) + tl_point = (margin, page.rect.height | margin) annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T163926293742Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T163927195943Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.33s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1446"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1446_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1446_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1446_1"><button class="btn btn-outline-danger"><span class="job_id">1446 : Job ID 7fb4cc1e4705401a86b37d663f0cbb0a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1446_1" data-parent="#job_list___sub_accordion_1446" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1446_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=299" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (299, 47), end pos: (299, 48)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_BitOr, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -296,7 +296,7 @@ try: # Shrink rectangle to a tiny box r = annot.rect - tiny = pymupdf.Rect(r.x0, r.y1 - 2, r.x0 + 2, r.y1) + tiny = pymupdf.Rect(r.x0, r.y1 | 2, r.x0 + 2, r.y1) annot.set_rect(tiny) except Exception as exc: logger.debug("Shrinking annotation rect failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.64s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1447"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1447_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1447_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1447_1"><button class="btn btn-outline-success"><span class="job_id">1447 : Job ID c4ae2d6d053446d092ed89d94d495146</span></button></div></a><div aria-labelledby="job_list___sub_heading_1447_1" data-parent="#job_list___sub_accordion_1447" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1447_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=278" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (278, 49), end pos: (278, 50)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_BitAnd, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -275,7 +275,7 @@ page = doc.load_page(0) # Place near top-left (PDF origin is bottom-left) margin = 2 - tl_point = (margin, page.rect.height - margin) + tl_point = (margin, page.rect.height &amp; margin) annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T010014408423Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T010015306439Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.29s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1448"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1448_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1448_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1448_1"><button class="btn btn-outline-danger"><span class="job_id">1448 : Job ID 557519beff8a489c8c13a338a80c1c40</span></button></div></a><div aria-labelledby="job_list___sub_heading_1448_1" data-parent="#job_list___sub_accordion_1448" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1448_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=299" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (299, 47), end pos: (299, 48)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_BitAnd, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -296,7 +296,7 @@ try: # Shrink rectangle to a tiny box r = annot.rect - tiny = pymupdf.Rect(r.x0, r.y1 - 2, r.x0 + 2, r.y1) + tiny = pymupdf.Rect(r.x0, r.y1 &amp; 2, r.x0 + 2, r.y1) annot.set_rect(tiny) except Exception as exc: logger.debug("Shrinking annotation rect failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.10s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1449"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1449_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1449_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1449_1"><button class="btn btn-outline-danger"><span class="job_id">1449 : Job ID d966c00d0596474b8adb556bdbeec9c0</span></button></div></a><div aria-labelledby="job_list___sub_heading_1449_1" data-parent="#job_list___sub_accordion_1449" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1449_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=278" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (278, 49), end pos: (278, 50)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_BitXor, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -275,7 +275,7 @@ page = doc.load_page(0) # Place near top-left (PDF origin is bottom-left) margin = 2 - tl_point = (margin, page.rect.height - margin) + tl_point = (margin, page.rect.height ^ margin) annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.13s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1450"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1450_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1450_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1450_1"><button class="btn btn-outline-success"><span class="job_id">1450 : Job ID bc758db140624f4092ede1e45d425a99</span></button></div></a><div aria-labelledby="job_list___sub_heading_1450_1" data-parent="#job_list___sub_accordion_1450" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1450_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=299" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (299, 47), end pos: (299, 48)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Sub_BitXor, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -296,7 +296,7 @@ try: # Shrink rectangle to a tiny box r = annot.rect - tiny = pymupdf.Rect(r.x0, r.y1 - 2, r.x0 + 2, r.y1) + tiny = pymupdf.Rect(r.x0, r.y1 ^ 2, r.x0 + 2, r.y1) annot.set_rect(tiny) except Exception as exc: logger.debug("Shrinking annotation rect failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e018044adebf7c5e6: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 21.20s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1451"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1451_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1451_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1451_1"><button class="btn btn-outline-danger"><span class="job_id">1451 : Job ID d5032c9321c343ecb8523ec837083cb8</span></button></div></a><div aria-labelledby="job_list___sub_heading_1451_1" data-parent="#job_list___sub_accordion_1451" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1451_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=77" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (77, 26), end pos: (77, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -74,7 +74,7 @@ pdf: PdfSource, secret: str, key: str, - intended_for: str | None = None, + intended_for: str + None = None, position: str | None = None, ) -&gt; bytes: if not HAS_PYMUPDF:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.90s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1452"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1452_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1452_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1452_1"><button class="btn btn-outline-danger"><span class="job_id">1452 : Job ID 7ca0d40cad2d45fc8732b9bfa43b3102</span></button></div></a><div aria-labelledby="job_list___sub_heading_1452_1" data-parent="#job_list___sub_accordion_1452" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1452_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=78" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (78, 22), end pos: (78, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -75,7 +75,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str + None = None, ) -&gt; bytes: if not HAS_PYMUPDF: raise WatermarkingError("PyMuPDF is required for this watermark method")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.20s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1453"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1453_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1453_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1453_1"><button class="btn btn-outline-success"><span class="job_id">1453 : Job ID a5f9dd5dfa5d47c4a37cf408ea9019f5</span></button></div></a><div aria-labelledby="job_list___sub_heading_1453_1" data-parent="#job_list___sub_accordion_1453" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1453_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=161" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (161, 22), end pos: (161, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -158,7 +158,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str + None = None, ) -&gt; bool: if not HAS_PYMUPDF: return False</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T161609540906Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T161610481290Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.35s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1454"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1454_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1454_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1454_1"><button class="btn btn-outline-danger"><span class="job_id">1454 : Job ID 1d1a8d79279e426d8b25472321fa7dd0</span></button></div></a><div aria-labelledby="job_list___sub_heading_1454_1" data-parent="#job_list___sub_accordion_1454" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1454_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=233" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (233, 61), end pos: (233, 62)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -230,7 +230,7 @@ # Internal helpers # --------------------- def _derive_key( - self, password: str, salt: bytes, iter_override: int | None = None + self, password: str, salt: bytes, iter_override: int + None = None ) -&gt; bytes: kdf = PBKDF2HMAC( algorithm=hashes.SHA256(),</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.05s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1455"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1455_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1455_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1455_1"><button class="btn btn-outline-success"><span class="job_id">1455 : Job ID c9c69a65bcc147caae52052a4bbab1c7</span></button></div></a><div aria-labelledby="job_list___sub_heading_1455_1" data-parent="#job_list___sub_accordion_1455" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1455_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=282" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (282, 26), end pos: (282, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -279,7 +279,7 @@ annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64) - flags = 1 | 2 | 32 | 64 + flags = 1 + 2 | 32 | 64 annot.set_flags(flags) except Exception as exc: logger.debug("Setting annotation flags failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e5c5256f8077a67bc: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 20.17s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1456"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1456_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1456_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1456_1"><button class="btn btn-outline-danger"><span class="job_id">1456 : Job ID d6b0781b60044edd813ffa5ac045ea31</span></button></div></a><div aria-labelledby="job_list___sub_heading_1456_1" data-parent="#job_list___sub_accordion_1456" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1456_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=282" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (282, 30), end pos: (282, 31)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -279,7 +279,7 @@ annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64) - flags = 1 | 2 | 32 | 64 + flags = 1 | 2 + 32 | 64 annot.set_flags(flags) except Exception as exc: logger.debug("Setting annotation flags failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.38s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1457"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1457_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1457_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1457_1"><button class="btn btn-outline-danger"><span class="job_id">1457 : Job ID 0fa9410f8805413eb2e7b40169373e97</span></button></div></a><div aria-labelledby="job_list___sub_heading_1457_1" data-parent="#job_list___sub_accordion_1457" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1457_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=282" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (282, 35), end pos: (282, 36)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -279,7 +279,7 @@ annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64) - flags = 1 | 2 | 32 | 64 + flags = 1 | 2 | 32 + 64 annot.set_flags(flags) except Exception as exc: logger.debug("Setting annotation flags failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.61s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1458"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1458_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1458_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1458_1"><button class="btn btn-outline-danger"><span class="job_id">1458 : Job ID 1fc9880406414d0097f3dfbc12988465</span></button></div></a><div aria-labelledby="job_list___sub_heading_1458_1" data-parent="#job_list___sub_accordion_1458" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1458_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=311" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (311, 64), end pos: (311, 65)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -308,7 +308,7 @@ logger.debug("Adding invisible annotation failed: %s", exc) return None - def _extract_manifest(self, doc: pymupdf.Document) -&gt; bytes | None: + def _extract_manifest(self, doc: pymupdf.Document) -&gt; bytes + None: # Primary: embedded file logger = logging.getLogger(__name__) try:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.99s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1459"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1459_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1459_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1459_1"><button class="btn btn-outline-success"><span class="job_id">1459 : Job ID 9c46735b60b64328b02d69a49e14f92b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1459_1" data-parent="#job_list___sub_accordion_1459" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1459_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=319" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (319, 52), end pos: (319, 53)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 8</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -316,7 +316,7 @@ names = doc.embfile_names() if self._EMBED_NAME in names: file_bytes = doc.embfile_get(self._EMBED_NAME) - if isinstance(file_bytes, bytes | bytearray): + if isinstance(file_bytes, bytes + bytearray): return bytes(file_bytes) except Exception as exc: logger.debug("Failed to extract embedded manifest: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T054108978618Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T054110009464Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.89s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1460"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1460_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1460_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1460_1"><button class="btn btn-outline-danger"><span class="job_id">1460 : Job ID 3af91186e87149bebc6571b56d72d76f</span></button></div></a><div aria-labelledby="job_list___sub_heading_1460_1" data-parent="#job_list___sub_accordion_1460" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1460_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=77" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (77, 26), end pos: (77, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -74,7 +74,7 @@ pdf: PdfSource, secret: str, key: str, - intended_for: str | None = None, + intended_for: str - None = None, position: str | None = None, ) -&gt; bytes: if not HAS_PYMUPDF:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.08s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1461"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1461_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1461_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1461_1"><button class="btn btn-outline-success"><span class="job_id">1461 : Job ID a9c6c21c363044d38ed1180c76fe7e7e</span></button></div></a><div aria-labelledby="job_list___sub_heading_1461_1" data-parent="#job_list___sub_accordion_1461" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1461_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=78" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (78, 22), end pos: (78, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -75,7 +75,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str - None = None, ) -&gt; bytes: if not HAS_PYMUPDF: raise WatermarkingError("PyMuPDF is required for this watermark method")</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T161245393139Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T161246330728Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.38s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1462"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1462_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1462_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1462_1"><button class="btn btn-outline-success"><span class="job_id">1462 : Job ID 018c5b0290f846c1b4c497dd231304ea</span></button></div></a><div aria-labelledby="job_list___sub_heading_1462_1" data-parent="#job_list___sub_accordion_1462" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1462_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=161" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (161, 22), end pos: (161, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -158,7 +158,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str - None = None, ) -&gt; bool: if not HAS_PYMUPDF: return False</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T045011041039Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T045011924361Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.51s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1463"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1463_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1463_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1463_1"><button class="btn btn-outline-danger"><span class="job_id">1463 : Job ID f95d5a3b8163457396fdb6ec3012f63d</span></button></div></a><div aria-labelledby="job_list___sub_heading_1463_1" data-parent="#job_list___sub_accordion_1463" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1463_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=233" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (233, 61), end pos: (233, 62)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -230,7 +230,7 @@ # Internal helpers # --------------------- def _derive_key( - self, password: str, salt: bytes, iter_override: int | None = None + self, password: str, salt: bytes, iter_override: int - None = None ) -&gt; bytes: kdf = PBKDF2HMAC( algorithm=hashes.SHA256(),</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.15s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1464"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1464_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1464_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1464_1"><button class="btn btn-outline-success"><span class="job_id">1464 : Job ID f2315bc1d7c142fd9982881b6d8b7f21</span></button></div></a><div aria-labelledby="job_list___sub_heading_1464_1" data-parent="#job_list___sub_accordion_1464" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1464_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=282" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (282, 26), end pos: (282, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -279,7 +279,7 @@ annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64) - flags = 1 | 2 | 32 | 64 + flags = 1 - 2 | 32 | 64 annot.set_flags(flags) except Exception as exc: logger.debug("Setting annotation flags failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T183428720914Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T183429699969Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.89s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1465"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1465_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1465_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1465_1"><button class="btn btn-outline-danger"><span class="job_id">1465 : Job ID 180f895848b94a00be56903faa89d6b4</span></button></div></a><div aria-labelledby="job_list___sub_heading_1465_1" data-parent="#job_list___sub_accordion_1465" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1465_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=282" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (282, 30), end pos: (282, 31)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -279,7 +279,7 @@ annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64) - flags = 1 | 2 | 32 | 64 + flags = 1 | 2 - 32 | 64 annot.set_flags(flags) except Exception as exc: logger.debug("Setting annotation flags failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.42s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1466"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1466_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1466_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1466_1"><button class="btn btn-outline-danger"><span class="job_id">1466 : Job ID 31379de344ad460caa3584aad053db2f</span></button></div></a><div aria-labelledby="job_list___sub_heading_1466_1" data-parent="#job_list___sub_accordion_1466" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1466_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=282" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (282, 35), end pos: (282, 36)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -279,7 +279,7 @@ annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64) - flags = 1 | 2 | 32 | 64 + flags = 1 | 2 | 32 - 64 annot.set_flags(flags) except Exception as exc: logger.debug("Setting annotation flags failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.97s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1467"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1467_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1467_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1467_1"><button class="btn btn-outline-success"><span class="job_id">1467 : Job ID 68356d294b0749798db8db67e5736313</span></button></div></a><div aria-labelledby="job_list___sub_heading_1467_1" data-parent="#job_list___sub_accordion_1467" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1467_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=311" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (311, 64), end pos: (311, 65)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -308,7 +308,7 @@ logger.debug("Adding invisible annotation failed: %s", exc) return None - def _extract_manifest(self, doc: pymupdf.Document) -&gt; bytes | None: + def _extract_manifest(self, doc: pymupdf.Document) -&gt; bytes - None: # Primary: embedded file logger = logging.getLogger(__name__) try:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T203536204454Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T203537111907Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.60s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1468"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1468_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1468_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1468_1"><button class="btn btn-outline-success"><span class="job_id">1468 : Job ID f826a665c8e246c99af5af8bef792758</span></button></div></a><div aria-labelledby="job_list___sub_heading_1468_1" data-parent="#job_list___sub_accordion_1468" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1468_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=319" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (319, 52), end pos: (319, 53)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 8</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -316,7 +316,7 @@ names = doc.embfile_names() if self._EMBED_NAME in names: file_bytes = doc.embfile_get(self._EMBED_NAME) - if isinstance(file_bytes, bytes | bytearray): + if isinstance(file_bytes, bytes - bytearray): return bytes(file_bytes) except Exception as exc: logger.debug("Failed to extract embedded manifest: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T172454218254Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T172455095337Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.35s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1469"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1469_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1469_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1469_1"><button class="btn btn-outline-success"><span class="job_id">1469 : Job ID d4a1307e0f9446d5a9c20ddf8ce69cbc</span></button></div></a><div aria-labelledby="job_list___sub_heading_1469_1" data-parent="#job_list___sub_accordion_1469" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1469_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=77" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (77, 26), end pos: (77, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -74,7 +74,7 @@ pdf: PdfSource, secret: str, key: str, - intended_for: str | None = None, + intended_for: str * None = None, position: str | None = None, ) -&gt; bytes: if not HAS_PYMUPDF:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T015731512964Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T015732510866Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.38s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1470"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1470_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1470_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1470_1"><button class="btn btn-outline-danger"><span class="job_id">1470 : Job ID ac10b2c161b046f6927ffe39431cffd6</span></button></div></a><div aria-labelledby="job_list___sub_heading_1470_1" data-parent="#job_list___sub_accordion_1470" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1470_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=78" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (78, 22), end pos: (78, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -75,7 +75,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str * None = None, ) -&gt; bytes: if not HAS_PYMUPDF: raise WatermarkingError("PyMuPDF is required for this watermark method")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.01s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1471"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1471_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1471_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1471_1"><button class="btn btn-outline-danger"><span class="job_id">1471 : Job ID 3d3bdb6fcf564802b34a3e8e3f931425</span></button></div></a><div aria-labelledby="job_list___sub_heading_1471_1" data-parent="#job_list___sub_accordion_1471" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1471_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=161" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (161, 22), end pos: (161, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -158,7 +158,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str * None = None, ) -&gt; bool: if not HAS_PYMUPDF: return False</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.39s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1472"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1472_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1472_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1472_1"><button class="btn btn-outline-danger"><span class="job_id">1472 : Job ID cb2d3fc923ec47f1ab046b6eff86c627</span></button></div></a><div aria-labelledby="job_list___sub_heading_1472_1" data-parent="#job_list___sub_accordion_1472" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1472_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=233" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (233, 61), end pos: (233, 62)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -230,7 +230,7 @@ # Internal helpers # --------------------- def _derive_key( - self, password: str, salt: bytes, iter_override: int | None = None + self, password: str, salt: bytes, iter_override: int * None = None ) -&gt; bytes: kdf = PBKDF2HMAC( algorithm=hashes.SHA256(),</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.01s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1473"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1473_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1473_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1473_1"><button class="btn btn-outline-danger"><span class="job_id">1473 : Job ID 21b7a811c11c480f8843152d00e751fc</span></button></div></a><div aria-labelledby="job_list___sub_heading_1473_1" data-parent="#job_list___sub_accordion_1473" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1473_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=282" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (282, 26), end pos: (282, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -279,7 +279,7 @@ annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64) - flags = 1 | 2 | 32 | 64 + flags = 1 * 2 | 32 | 64 annot.set_flags(flags) except Exception as exc: logger.debug("Setting annotation flags failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.68s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1474"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1474_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1474_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1474_1"><button class="btn btn-outline-danger"><span class="job_id">1474 : Job ID 3c87f640ec884c4eb63b9f54ed1d8f6f</span></button></div></a><div aria-labelledby="job_list___sub_heading_1474_1" data-parent="#job_list___sub_accordion_1474" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1474_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=282" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (282, 30), end pos: (282, 31)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -279,7 +279,7 @@ annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64) - flags = 1 | 2 | 32 | 64 + flags = 1 | 2 * 32 | 64 annot.set_flags(flags) except Exception as exc: logger.debug("Setting annotation flags failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.12s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1475"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1475_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1475_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1475_1"><button class="btn btn-outline-danger"><span class="job_id">1475 : Job ID 38a550a284664500b3cd90bad151a583</span></button></div></a><div aria-labelledby="job_list___sub_heading_1475_1" data-parent="#job_list___sub_accordion_1475" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1475_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=282" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (282, 35), end pos: (282, 36)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -279,7 +279,7 @@ annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64) - flags = 1 | 2 | 32 | 64 + flags = 1 | 2 | 32 * 64 annot.set_flags(flags) except Exception as exc: logger.debug("Setting annotation flags failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.58s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1476"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1476_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1476_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1476_1"><button class="btn btn-outline-success"><span class="job_id">1476 : Job ID 969651a5aa06408f80a811c2c510c10b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1476_1" data-parent="#job_list___sub_accordion_1476" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1476_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=311" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (311, 64), end pos: (311, 65)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -308,7 +308,7 @@ logger.debug("Adding invisible annotation failed: %s", exc) return None - def _extract_manifest(self, doc: pymupdf.Document) -&gt; bytes | None: + def _extract_manifest(self, doc: pymupdf.Document) -&gt; bytes * None: # Primary: embedded file logger = logging.getLogger(__name__) try:</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e814ab849b161828e: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.53s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1477"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1477_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1477_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1477_1"><button class="btn btn-outline-danger"><span class="job_id">1477 : Job ID f21d5b44aa2048cb8544abf97d248e9e</span></button></div></a><div aria-labelledby="job_list___sub_heading_1477_1" data-parent="#job_list___sub_accordion_1477" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1477_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=319" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (319, 52), end pos: (319, 53)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 8</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -316,7 +316,7 @@ names = doc.embfile_names() if self._EMBED_NAME in names: file_bytes = doc.embfile_get(self._EMBED_NAME) - if isinstance(file_bytes, bytes | bytearray): + if isinstance(file_bytes, bytes * bytearray): return bytes(file_bytes) except Exception as exc: logger.debug("Failed to extract embedded manifest: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.20s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1478"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1478_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1478_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1478_1"><button class="btn btn-outline-success"><span class="job_id">1478 : Job ID 2095bd63c7f24eae8a08de598ce988c4</span></button></div></a><div aria-labelledby="job_list___sub_heading_1478_1" data-parent="#job_list___sub_accordion_1478" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1478_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=77" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (77, 26), end pos: (77, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -74,7 +74,7 @@ pdf: PdfSource, secret: str, key: str, - intended_for: str | None = None, + intended_for: str / None = None, position: str | None = None, ) -&gt; bytes: if not HAS_PYMUPDF:</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%]</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1479"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1479_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1479_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1479_1"><button class="btn btn-outline-danger"><span class="job_id">1479 : Job ID 9770c3d754c14335b1471881256022d9</span></button></div></a><div aria-labelledby="job_list___sub_heading_1479_1" data-parent="#job_list___sub_accordion_1479" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1479_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=78" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (78, 22), end pos: (78, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -75,7 +75,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str / None = None, ) -&gt; bytes: if not HAS_PYMUPDF: raise WatermarkingError("PyMuPDF is required for this watermark method")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.57s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1480"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1480_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1480_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1480_1"><button class="btn btn-outline-danger"><span class="job_id">1480 : Job ID b32e0a86d5a14bdeb029193d9d3c11b8</span></button></div></a><div aria-labelledby="job_list___sub_heading_1480_1" data-parent="#job_list___sub_accordion_1480" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1480_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=161" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (161, 22), end pos: (161, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -158,7 +158,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str / None = None, ) -&gt; bool: if not HAS_PYMUPDF: return False</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.09s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1481"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1481_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1481_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1481_1"><button class="btn btn-outline-success"><span class="job_id">1481 : Job ID 1ddcee71e3214ee8a5485cad99567079</span></button></div></a><div aria-labelledby="job_list___sub_heading_1481_1" data-parent="#job_list___sub_accordion_1481" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1481_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=233" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (233, 61), end pos: (233, 62)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -230,7 +230,7 @@ # Internal helpers # --------------------- def _derive_key( - self, password: str, salt: bytes, iter_override: int | None = None + self, password: str, salt: bytes, iter_override: int / None = None ) -&gt; bytes: kdf = PBKDF2HMAC( algorithm=hashes.SHA256(),</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T153853260149Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T153854132184Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.20s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1482"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1482_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1482_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1482_1"><button class="btn btn-outline-danger"><span class="job_id">1482 : Job ID 6a448db542ae4deba6e21868b70ba38a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1482_1" data-parent="#job_list___sub_accordion_1482" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1482_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=282" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (282, 26), end pos: (282, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -279,7 +279,7 @@ annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64) - flags = 1 | 2 | 32 | 64 + flags = 1 / 2 | 32 | 64 annot.set_flags(flags) except Exception as exc: logger.debug("Setting annotation flags failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.64s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1483"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1483_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1483_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1483_1"><button class="btn btn-outline-danger"><span class="job_id">1483 : Job ID d62a15a3b4794c79b54c33cc4792ade0</span></button></div></a><div aria-labelledby="job_list___sub_heading_1483_1" data-parent="#job_list___sub_accordion_1483" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1483_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=282" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (282, 30), end pos: (282, 31)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -279,7 +279,7 @@ annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64) - flags = 1 | 2 | 32 | 64 + flags = 1 | 2 / 32 | 64 annot.set_flags(flags) except Exception as exc: logger.debug("Setting annotation flags failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.35s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1484"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1484_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1484_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1484_1"><button class="btn btn-outline-danger"><span class="job_id">1484 : Job ID 438e030ec16549558370dc0426a9d888</span></button></div></a><div aria-labelledby="job_list___sub_heading_1484_1" data-parent="#job_list___sub_accordion_1484" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1484_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=282" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (282, 35), end pos: (282, 36)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -279,7 +279,7 @@ annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64) - flags = 1 | 2 | 32 | 64 + flags = 1 | 2 | 32 / 64 annot.set_flags(flags) except Exception as exc: logger.debug("Setting annotation flags failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.54s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1485"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1485_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1485_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1485_1"><button class="btn btn-outline-danger"><span class="job_id">1485 : Job ID cec8d2d977284cf1b72f3a266131f662</span></button></div></a><div aria-labelledby="job_list___sub_heading_1485_1" data-parent="#job_list___sub_accordion_1485" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1485_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=311" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (311, 64), end pos: (311, 65)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -308,7 +308,7 @@ logger.debug("Adding invisible annotation failed: %s", exc) return None - def _extract_manifest(self, doc: pymupdf.Document) -&gt; bytes | None: + def _extract_manifest(self, doc: pymupdf.Document) -&gt; bytes / None: # Primary: embedded file logger = logging.getLogger(__name__) try:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.96s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1486"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1486_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1486_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1486_1"><button class="btn btn-outline-success"><span class="job_id">1486 : Job ID 9ac568260e8a492a82eb6082434cd144</span></button></div></a><div aria-labelledby="job_list___sub_heading_1486_1" data-parent="#job_list___sub_accordion_1486" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1486_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=319" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (319, 52), end pos: (319, 53)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 8</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -316,7 +316,7 @@ names = doc.embfile_names() if self._EMBED_NAME in names: file_bytes = doc.embfile_get(self._EMBED_NAME) - if isinstance(file_bytes, bytes | bytearray): + if isinstance(file_bytes, bytes / bytearray): return bytes(file_bytes) except Exception as exc: logger.debug("Failed to extract embedded manifest: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T232951883395Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T232952739496Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.37s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1487"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1487_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1487_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1487_1"><button class="btn btn-outline-danger"><span class="job_id">1487 : Job ID 0c50ea8719e648d193f70eea8434b3fb</span></button></div></a><div aria-labelledby="job_list___sub_heading_1487_1" data-parent="#job_list___sub_accordion_1487" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1487_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=77" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (77, 26), end pos: (77, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -74,7 +74,7 @@ pdf: PdfSource, secret: str, key: str, - intended_for: str | None = None, + intended_for: str // None = None, position: str | None = None, ) -&gt; bytes: if not HAS_PYMUPDF:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.06s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1488"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1488_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1488_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1488_1"><button class="btn btn-outline-danger"><span class="job_id">1488 : Job ID eaff45d6b1d5441e941f1562cd8f8b72</span></button></div></a><div aria-labelledby="job_list___sub_heading_1488_1" data-parent="#job_list___sub_accordion_1488" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1488_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=78" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (78, 22), end pos: (78, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -75,7 +75,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str // None = None, ) -&gt; bytes: if not HAS_PYMUPDF: raise WatermarkingError("PyMuPDF is required for this watermark method")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.49s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1489"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1489_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1489_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1489_1"><button class="btn btn-outline-danger"><span class="job_id">1489 : Job ID d98acb1966ba48689da2bd8931dd83f8</span></button></div></a><div aria-labelledby="job_list___sub_heading_1489_1" data-parent="#job_list___sub_accordion_1489" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1489_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=161" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (161, 22), end pos: (161, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -158,7 +158,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str // None = None, ) -&gt; bool: if not HAS_PYMUPDF: return False</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.09s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1490"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1490_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1490_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1490_1"><button class="btn btn-outline-success"><span class="job_id">1490 : Job ID c22bd1dec5e74c089d5d7020bdd6e66a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1490_1" data-parent="#job_list___sub_accordion_1490" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1490_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=233" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (233, 61), end pos: (233, 62)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -230,7 +230,7 @@ # Internal helpers # --------------------- def _derive_key( - self, password: str, salt: bytes, iter_override: int | None = None + self, password: str, salt: bytes, iter_override: int // None = None ) -&gt; bytes: kdf = PBKDF2HMAC( algorithm=hashes.SHA256(),</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T224302845791Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T224303696224Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.58s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1491"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1491_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1491_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1491_1"><button class="btn btn-outline-success"><span class="job_id">1491 : Job ID bded0ce012ac4e1ab75d64e4c6d6b78b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1491_1" data-parent="#job_list___sub_accordion_1491" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1491_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=282" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (282, 26), end pos: (282, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -279,7 +279,7 @@ annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64) - flags = 1 | 2 | 32 | 64 + flags = 1 // 2 | 32 | 64 annot.set_flags(flags) except Exception as exc: logger.debug("Setting annotation flags failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T003321136016Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T003321997566Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.17s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1492"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1492_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1492_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1492_1"><button class="btn btn-outline-danger"><span class="job_id">1492 : Job ID a0c53b9ba3f94083ac5f67103403cbb9</span></button></div></a><div aria-labelledby="job_list___sub_heading_1492_1" data-parent="#job_list___sub_accordion_1492" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1492_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=282" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (282, 30), end pos: (282, 31)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -279,7 +279,7 @@ annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64) - flags = 1 | 2 | 32 | 64 + flags = 1 | 2 // 32 | 64 annot.set_flags(flags) except Exception as exc: logger.debug("Setting annotation flags failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.49s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1493"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1493_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1493_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1493_1"><button class="btn btn-outline-danger"><span class="job_id">1493 : Job ID 9dc38454a1ae4c9db96a4096e37c806e</span></button></div></a><div aria-labelledby="job_list___sub_heading_1493_1" data-parent="#job_list___sub_accordion_1493" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1493_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=282" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (282, 35), end pos: (282, 36)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -279,7 +279,7 @@ annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64) - flags = 1 | 2 | 32 | 64 + flags = 1 | 2 | 32 // 64 annot.set_flags(flags) except Exception as exc: logger.debug("Setting annotation flags failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.80s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1494"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1494_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1494_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1494_1"><button class="btn btn-outline-success"><span class="job_id">1494 : Job ID 51004bd93d9f435b84c82b87e40d4826</span></button></div></a><div aria-labelledby="job_list___sub_heading_1494_1" data-parent="#job_list___sub_accordion_1494" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1494_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=311" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (311, 64), end pos: (311, 65)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -308,7 +308,7 @@ logger.debug("Adding invisible annotation failed: %s", exc) return None - def _extract_manifest(self, doc: pymupdf.Document) -&gt; bytes | None: + def _extract_manifest(self, doc: pymupdf.Document) -&gt; bytes // None: # Primary: embedded file logger = logging.getLogger(__name__) try:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T031252956017Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T031253874213Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.38s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1495"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1495_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1495_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1495_1"><button class="btn btn-outline-danger"><span class="job_id">1495 : Job ID ebefe6768b61417e8b9d3fb02a8fe41d</span></button></div></a><div aria-labelledby="job_list___sub_heading_1495_1" data-parent="#job_list___sub_accordion_1495" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1495_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=319" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (319, 52), end pos: (319, 53)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 8</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -316,7 +316,7 @@ names = doc.embfile_names() if self._EMBED_NAME in names: file_bytes = doc.embfile_get(self._EMBED_NAME) - if isinstance(file_bytes, bytes | bytearray): + if isinstance(file_bytes, bytes // bytearray): return bytes(file_bytes) except Exception as exc: logger.debug("Failed to extract embedded manifest: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.56s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1496"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1496_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1496_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1496_1"><button class="btn btn-outline-danger"><span class="job_id">1496 : Job ID db5290c5ba02442a934acab8495a93d6</span></button></div></a><div aria-labelledby="job_list___sub_heading_1496_1" data-parent="#job_list___sub_accordion_1496" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1496_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=77" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (77, 26), end pos: (77, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -74,7 +74,7 @@ pdf: PdfSource, secret: str, key: str, - intended_for: str | None = None, + intended_for: str % None = None, position: str | None = None, ) -&gt; bytes: if not HAS_PYMUPDF:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.07s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1497"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1497_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1497_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1497_1"><button class="btn btn-outline-danger"><span class="job_id">1497 : Job ID 34d14a62df8042f6af82acd735bad2a6</span></button></div></a><div aria-labelledby="job_list___sub_heading_1497_1" data-parent="#job_list___sub_accordion_1497" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1497_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=78" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (78, 22), end pos: (78, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -75,7 +75,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str % None = None, ) -&gt; bytes: if not HAS_PYMUPDF: raise WatermarkingError("PyMuPDF is required for this watermark method")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.13s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1498"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1498_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1498_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1498_1"><button class="btn btn-outline-danger"><span class="job_id">1498 : Job ID f88a673fa7ac443ea86dbb4e25b726cc</span></button></div></a><div aria-labelledby="job_list___sub_heading_1498_1" data-parent="#job_list___sub_accordion_1498" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1498_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=161" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (161, 22), end pos: (161, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -158,7 +158,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str % None = None, ) -&gt; bool: if not HAS_PYMUPDF: return False</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.38s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1499"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1499_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1499_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1499_1"><button class="btn btn-outline-danger"><span class="job_id">1499 : Job ID 9bbf0d2c543c49f8b5658cc6c0d6c344</span></button></div></a><div aria-labelledby="job_list___sub_heading_1499_1" data-parent="#job_list___sub_accordion_1499" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1499_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=233" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (233, 61), end pos: (233, 62)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -230,7 +230,7 @@ # Internal helpers # --------------------- def _derive_key( - self, password: str, salt: bytes, iter_override: int | None = None + self, password: str, salt: bytes, iter_override: int % None = None ) -&gt; bytes: kdf = PBKDF2HMAC( algorithm=hashes.SHA256(),</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.56s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1500"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1500_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1500_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1500_1"><button class="btn btn-outline-danger"><span class="job_id">1500 : Job ID 653ddc703f6942659c72a58bed992f91</span></button></div></a><div aria-labelledby="job_list___sub_heading_1500_1" data-parent="#job_list___sub_accordion_1500" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1500_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=282" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (282, 26), end pos: (282, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -279,7 +279,7 @@ annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64) - flags = 1 | 2 | 32 | 64 + flags = 1 % 2 | 32 | 64 annot.set_flags(flags) except Exception as exc: logger.debug("Setting annotation flags failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.08s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1501"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1501_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1501_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1501_1"><button class="btn btn-outline-success"><span class="job_id">1501 : Job ID d4120c9e2db4402a83a01de1a064d7b8</span></button></div></a><div aria-labelledby="job_list___sub_heading_1501_1" data-parent="#job_list___sub_accordion_1501" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1501_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=282" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (282, 30), end pos: (282, 31)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -279,7 +279,7 @@ annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64) - flags = 1 | 2 | 32 | 64 + flags = 1 | 2 % 32 | 64 annot.set_flags(flags) except Exception as exc: logger.debug("Setting annotation flags failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e3c6749cb3f68222f: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.72s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1502"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1502_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1502_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1502_1"><button class="btn btn-outline-danger"><span class="job_id">1502 : Job ID 4a9776c5870c4ee695b426ef37c1e7cf</span></button></div></a><div aria-labelledby="job_list___sub_heading_1502_1" data-parent="#job_list___sub_accordion_1502" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1502_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=282" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (282, 35), end pos: (282, 36)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -279,7 +279,7 @@ annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64) - flags = 1 | 2 | 32 | 64 + flags = 1 | 2 | 32 % 64 annot.set_flags(flags) except Exception as exc: logger.debug("Setting annotation flags failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.14s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1503"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1503_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1503_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1503_1"><button class="btn btn-outline-danger"><span class="job_id">1503 : Job ID b12b6188f5c74aa2a18c2d1d6830335a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1503_1" data-parent="#job_list___sub_accordion_1503" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1503_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=311" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (311, 64), end pos: (311, 65)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -308,7 +308,7 @@ logger.debug("Adding invisible annotation failed: %s", exc) return None - def _extract_manifest(self, doc: pymupdf.Document) -&gt; bytes | None: + def _extract_manifest(self, doc: pymupdf.Document) -&gt; bytes % None: # Primary: embedded file logger = logging.getLogger(__name__) try:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.25s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1504"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1504_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1504_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1504_1"><button class="btn btn-outline-danger"><span class="job_id">1504 : Job ID d65fdc05b300457680c4e91ec0773103</span></button></div></a><div aria-labelledby="job_list___sub_heading_1504_1" data-parent="#job_list___sub_accordion_1504" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1504_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=319" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (319, 52), end pos: (319, 53)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 8</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -316,7 +316,7 @@ names = doc.embfile_names() if self._EMBED_NAME in names: file_bytes = doc.embfile_get(self._EMBED_NAME) - if isinstance(file_bytes, bytes | bytearray): + if isinstance(file_bytes, bytes % bytearray): return bytes(file_bytes) except Exception as exc: logger.debug("Failed to extract embedded manifest: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.05s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1505"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1505_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1505_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1505_1"><button class="btn btn-outline-danger"><span class="job_id">1505 : Job ID e746f3a8fc134abeb888794f7febb39d</span></button></div></a><div aria-labelledby="job_list___sub_heading_1505_1" data-parent="#job_list___sub_accordion_1505" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1505_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=77" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (77, 26), end pos: (77, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -74,7 +74,7 @@ pdf: PdfSource, secret: str, key: str, - intended_for: str | None = None, + intended_for: str ** None = None, position: str | None = None, ) -&gt; bytes: if not HAS_PYMUPDF:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.97s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1506"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1506_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1506_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1506_1"><button class="btn btn-outline-danger"><span class="job_id">1506 : Job ID 782c271b78dd40dd90061304dde1bc4d</span></button></div></a><div aria-labelledby="job_list___sub_heading_1506_1" data-parent="#job_list___sub_accordion_1506" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1506_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=78" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (78, 22), end pos: (78, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -75,7 +75,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str ** None = None, ) -&gt; bytes: if not HAS_PYMUPDF: raise WatermarkingError("PyMuPDF is required for this watermark method")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.03s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1507"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1507_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1507_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1507_1"><button class="btn btn-outline-success"><span class="job_id">1507 : Job ID a77e392b00594417a49cae441de8cec1</span></button></div></a><div aria-labelledby="job_list___sub_heading_1507_1" data-parent="#job_list___sub_accordion_1507" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1507_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=161" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (161, 22), end pos: (161, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -158,7 +158,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str ** None = None, ) -&gt; bool: if not HAS_PYMUPDF: return False</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ee0d3266162b01387: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 21.68s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1508"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1508_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1508_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1508_1"><button class="btn btn-outline-success"><span class="job_id">1508 : Job ID 81ca68fee8a04ecca6dab847e2bd0474</span></button></div></a><div aria-labelledby="job_list___sub_heading_1508_1" data-parent="#job_list___sub_accordion_1508" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1508_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=233" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (233, 61), end pos: (233, 62)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -230,7 +230,7 @@ # Internal helpers # --------------------- def _derive_key( - self, password: str, salt: bytes, iter_override: int | None = None + self, password: str, salt: bytes, iter_override: int ** None = None ) -&gt; bytes: kdf = PBKDF2HMAC( algorithm=hashes.SHA256(),</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T035648550770Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T035649385231Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 20.06s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1509"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1509_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1509_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1509_1"><button class="btn btn-outline-danger"><span class="job_id">1509 : Job ID 578d5af196bd49b99cc33b492fd41dcf</span></button></div></a><div aria-labelledby="job_list___sub_heading_1509_1" data-parent="#job_list___sub_accordion_1509" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1509_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=282" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (282, 26), end pos: (282, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -279,7 +279,7 @@ annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64) - flags = 1 | 2 | 32 | 64 + flags = 1 ** 2 | 32 | 64 annot.set_flags(flags) except Exception as exc: logger.debug("Setting annotation flags failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.32s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1510"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1510_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1510_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1510_1"><button class="btn btn-outline-danger"><span class="job_id">1510 : Job ID feddde5542da465dbf0de8b86df507a8</span></button></div></a><div aria-labelledby="job_list___sub_heading_1510_1" data-parent="#job_list___sub_accordion_1510" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1510_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=282" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (282, 30), end pos: (282, 31)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -279,7 +279,7 @@ annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64) - flags = 1 | 2 | 32 | 64 + flags = 1 | 2 ** 32 | 64 annot.set_flags(flags) except Exception as exc: logger.debug("Setting annotation flags failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.89s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1511"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1511_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1511_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1511_1"><button class="btn btn-outline-success"><span class="job_id">1511 : Job ID d148a51c676d4cb58a515d01efbd0071</span></button></div></a><div aria-labelledby="job_list___sub_heading_1511_1" data-parent="#job_list___sub_accordion_1511" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1511_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=282" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (282, 35), end pos: (282, 36)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -279,7 +279,7 @@ annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64) - flags = 1 | 2 | 32 | 64 + flags = 1 | 2 | 32 ** 64 annot.set_flags(flags) except Exception as exc: logger.debug("Setting annotation flags failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">...F.......... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:228: in open request = self._request_from_builder_args(args, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:200: in _request_from_builder_args return builder.get_request() ^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:764: in get_request return cls(self.get_environ()) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:688: in get_environ input_stream, content_length, boundary = stream_encode_multipart( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:130: in stream_encode_multipart write_binary(encoder.send_event(Data(data=chunk, more_data=True))) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:81: in write_binary return stream.write(s) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... 1 failed, 13 passed, 22 warnings in 21.23s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1512"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1512_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1512_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1512_1"><button class="btn btn-outline-danger"><span class="job_id">1512 : Job ID 21d077c8edad4d1ab936746dd51b56bf</span></button></div></a><div aria-labelledby="job_list___sub_heading_1512_1" data-parent="#job_list___sub_accordion_1512" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1512_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=311" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (311, 64), end pos: (311, 65)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -308,7 +308,7 @@ logger.debug("Adding invisible annotation failed: %s", exc) return None - def _extract_manifest(self, doc: pymupdf.Document) -&gt; bytes | None: + def _extract_manifest(self, doc: pymupdf.Document) -&gt; bytes ** None: # Primary: embedded file logger = logging.getLogger(__name__) try:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.12s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1513"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1513_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1513_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1513_1"><button class="btn btn-outline-danger"><span class="job_id">1513 : Job ID 69b3dca901c14d669a08348e507ba73b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1513_1" data-parent="#job_list___sub_accordion_1513" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1513_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=319" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (319, 52), end pos: (319, 53)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 8</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -316,7 +316,7 @@ names = doc.embfile_names() if self._EMBED_NAME in names: file_bytes = doc.embfile_get(self._EMBED_NAME) - if isinstance(file_bytes, bytes | bytearray): + if isinstance(file_bytes, bytes ** bytearray): return bytes(file_bytes) except Exception as exc: logger.debug("Failed to extract embedded manifest: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.05s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1514"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1514_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1514_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1514_1"><button class="btn btn-outline-success"><span class="job_id">1514 : Job ID e7111c0210504f2bb712cb78d85c1502</span></button></div></a><div aria-labelledby="job_list___sub_heading_1514_1" data-parent="#job_list___sub_accordion_1514" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1514_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=77" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (77, 26), end pos: (77, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -74,7 +74,7 @@ pdf: PdfSource, secret: str, key: str, - intended_for: str | None = None, + intended_for: str &gt;&gt; None = None, position: str | None = None, ) -&gt; bytes: if not HAS_PYMUPDF:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T235342708819Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T235343645464Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.41s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1515"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1515_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1515_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1515_1"><button class="btn btn-outline-success"><span class="job_id">1515 : Job ID 45f3ef7d06e244069bf03ab8a93c86b2</span></button></div></a><div aria-labelledby="job_list___sub_heading_1515_1" data-parent="#job_list___sub_accordion_1515" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1515_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=78" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (78, 22), end pos: (78, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -75,7 +75,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str &gt;&gt; None = None, ) -&gt; bytes: if not HAS_PYMUPDF: raise WatermarkingError("PyMuPDF is required for this watermark method")</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T150047117660Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T150047959648Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.35s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1516"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1516_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1516_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1516_1"><button class="btn btn-outline-success"><span class="job_id">1516 : Job ID 8f8854e43ac345438a32bdfb79f8fb97</span></button></div></a><div aria-labelledby="job_list___sub_heading_1516_1" data-parent="#job_list___sub_accordion_1516" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1516_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=161" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (161, 22), end pos: (161, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -158,7 +158,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str &gt;&gt; None = None, ) -&gt; bool: if not HAS_PYMUPDF: return False</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T171421565375Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T171422506038Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.48s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1517"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1517_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1517_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1517_1"><button class="btn btn-outline-danger"><span class="job_id">1517 : Job ID 0b54bdf55b3d4b39b1cc7b828fec788b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1517_1" data-parent="#job_list___sub_accordion_1517" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1517_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=233" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (233, 61), end pos: (233, 62)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -230,7 +230,7 @@ # Internal helpers # --------------------- def _derive_key( - self, password: str, salt: bytes, iter_override: int | None = None + self, password: str, salt: bytes, iter_override: int &gt;&gt; None = None ) -&gt; bytes: kdf = PBKDF2HMAC( algorithm=hashes.SHA256(),</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 22.11s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1518"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1518_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1518_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1518_1"><button class="btn btn-outline-danger"><span class="job_id">1518 : Job ID d88e7b8625974c0fa6c73231e72734c5</span></button></div></a><div aria-labelledby="job_list___sub_heading_1518_1" data-parent="#job_list___sub_accordion_1518" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1518_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=282" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (282, 26), end pos: (282, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -279,7 +279,7 @@ annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64) - flags = 1 | 2 | 32 | 64 + flags = 1 &gt;&gt; 2 | 32 | 64 annot.set_flags(flags) except Exception as exc: logger.debug("Setting annotation flags failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.15s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1519"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1519_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1519_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1519_1"><button class="btn btn-outline-danger"><span class="job_id">1519 : Job ID 4510bc1a04a144789b7d6bf585582173</span></button></div></a><div aria-labelledby="job_list___sub_heading_1519_1" data-parent="#job_list___sub_accordion_1519" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1519_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=282" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (282, 30), end pos: (282, 31)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -279,7 +279,7 @@ annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64) - flags = 1 | 2 | 32 | 64 + flags = 1 | 2 &gt;&gt; 32 | 64 annot.set_flags(flags) except Exception as exc: logger.debug("Setting annotation flags failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.84s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1520"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1520_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1520_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1520_1"><button class="btn btn-outline-danger"><span class="job_id">1520 : Job ID 17ed4dd8e4df43c3913802aa66914a21</span></button></div></a><div aria-labelledby="job_list___sub_heading_1520_1" data-parent="#job_list___sub_accordion_1520" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1520_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=282" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (282, 35), end pos: (282, 36)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -279,7 +279,7 @@ annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64) - flags = 1 | 2 | 32 | 64 + flags = 1 | 2 | 32 &gt;&gt; 64 annot.set_flags(flags) except Exception as exc: logger.debug("Setting annotation flags failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.54s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1521"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1521_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1521_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1521_1"><button class="btn btn-outline-danger"><span class="job_id">1521 : Job ID a80014eb95bb4a6a9b83efca9c0427c1</span></button></div></a><div aria-labelledby="job_list___sub_heading_1521_1" data-parent="#job_list___sub_accordion_1521" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1521_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=311" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (311, 64), end pos: (311, 65)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -308,7 +308,7 @@ logger.debug("Adding invisible annotation failed: %s", exc) return None - def _extract_manifest(self, doc: pymupdf.Document) -&gt; bytes | None: + def _extract_manifest(self, doc: pymupdf.Document) -&gt; bytes &gt;&gt; None: # Primary: embedded file logger = logging.getLogger(__name__) try:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.34s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1522"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1522_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1522_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1522_1"><button class="btn btn-outline-danger"><span class="job_id">1522 : Job ID 073aa879c40a4d0686e606bf95dc151c</span></button></div></a><div aria-labelledby="job_list___sub_heading_1522_1" data-parent="#job_list___sub_accordion_1522" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1522_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=319" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (319, 52), end pos: (319, 53)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 8</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -316,7 +316,7 @@ names = doc.embfile_names() if self._EMBED_NAME in names: file_bytes = doc.embfile_get(self._EMBED_NAME) - if isinstance(file_bytes, bytes | bytearray): + if isinstance(file_bytes, bytes &gt;&gt; bytearray): return bytes(file_bytes) except Exception as exc: logger.debug("Failed to extract embedded manifest: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.19s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1523"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1523_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1523_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1523_1"><button class="btn btn-outline-danger"><span class="job_id">1523 : Job ID 6558b748afa4460cbb9d02754c7b671a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1523_1" data-parent="#job_list___sub_accordion_1523" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1523_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=77" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (77, 26), end pos: (77, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -74,7 +74,7 @@ pdf: PdfSource, secret: str, key: str, - intended_for: str | None = None, + intended_for: str &lt;&lt; None = None, position: str | None = None, ) -&gt; bytes: if not HAS_PYMUPDF:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.87s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1524"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1524_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1524_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1524_1"><button class="btn btn-outline-danger"><span class="job_id">1524 : Job ID 97133cb9ff8b4d96b7090aa91a8420a8</span></button></div></a><div aria-labelledby="job_list___sub_heading_1524_1" data-parent="#job_list___sub_accordion_1524" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1524_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=78" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (78, 22), end pos: (78, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -75,7 +75,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str &lt;&lt; None = None, ) -&gt; bytes: if not HAS_PYMUPDF: raise WatermarkingError("PyMuPDF is required for this watermark method")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.04s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1525"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1525_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1525_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1525_1"><button class="btn btn-outline-success"><span class="job_id">1525 : Job ID eb54624ecfe145979987abf59c8052d1</span></button></div></a><div aria-labelledby="job_list___sub_heading_1525_1" data-parent="#job_list___sub_accordion_1525" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1525_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=161" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (161, 22), end pos: (161, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -158,7 +158,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str &lt;&lt; None = None, ) -&gt; bool: if not HAS_PYMUPDF: return False</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T040915845991Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T040916858119Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 20.65s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1526"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1526_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1526_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1526_1"><button class="btn btn-outline-success"><span class="job_id">1526 : Job ID 14ed693459a84b29b92e3b70125e7f2a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1526_1" data-parent="#job_list___sub_accordion_1526" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1526_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=233" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (233, 61), end pos: (233, 62)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -230,7 +230,7 @@ # Internal helpers # --------------------- def _derive_key( - self, password: str, salt: bytes, iter_override: int | None = None + self, password: str, salt: bytes, iter_override: int &lt;&lt; None = None ) -&gt; bytes: kdf = PBKDF2HMAC( algorithm=hashes.SHA256(),</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T143637504123Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T143638758610Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 20.31s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1527"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1527_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1527_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1527_1"><button class="btn btn-outline-danger"><span class="job_id">1527 : Job ID 2d21c31a0aa04aeba79bda9a4e50c551</span></button></div></a><div aria-labelledby="job_list___sub_heading_1527_1" data-parent="#job_list___sub_accordion_1527" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1527_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=282" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (282, 26), end pos: (282, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -279,7 +279,7 @@ annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64) - flags = 1 | 2 | 32 | 64 + flags = 1 &lt;&lt; 2 | 32 | 64 annot.set_flags(flags) except Exception as exc: logger.debug("Setting annotation flags failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.92s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1528"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1528_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1528_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1528_1"><button class="btn btn-outline-danger"><span class="job_id">1528 : Job ID 3b62cfcffe4a400083b9ef9adf58b2a2</span></button></div></a><div aria-labelledby="job_list___sub_heading_1528_1" data-parent="#job_list___sub_accordion_1528" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1528_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=282" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (282, 30), end pos: (282, 31)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -279,7 +279,7 @@ annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64) - flags = 1 | 2 | 32 | 64 + flags = 1 | 2 &lt;&lt; 32 | 64 annot.set_flags(flags) except Exception as exc: logger.debug("Setting annotation flags failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.39s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1529"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1529_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1529_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1529_1"><button class="btn btn-outline-danger"><span class="job_id">1529 : Job ID 764060b521d04f678936217adfb183c3</span></button></div></a><div aria-labelledby="job_list___sub_heading_1529_1" data-parent="#job_list___sub_accordion_1529" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1529_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=282" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (282, 35), end pos: (282, 36)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -279,7 +279,7 @@ annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64) - flags = 1 | 2 | 32 | 64 + flags = 1 | 2 | 32 &lt;&lt; 64 annot.set_flags(flags) except Exception as exc: logger.debug("Setting annotation flags failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.39s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1530"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1530_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1530_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1530_1"><button class="btn btn-outline-success"><span class="job_id">1530 : Job ID c66a916345e94db2967c3f1443154c23</span></button></div></a><div aria-labelledby="job_list___sub_heading_1530_1" data-parent="#job_list___sub_accordion_1530" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1530_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=311" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (311, 64), end pos: (311, 65)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -308,7 +308,7 @@ logger.debug("Adding invisible annotation failed: %s", exc) return None - def _extract_manifest(self, doc: pymupdf.Document) -&gt; bytes | None: + def _extract_manifest(self, doc: pymupdf.Document) -&gt; bytes &lt;&lt; None: # Primary: embedded file logger = logging.getLogger(__name__) try:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T213348248585Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T213349073810Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.23s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1531"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1531_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1531_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1531_1"><button class="btn btn-outline-success"><span class="job_id">1531 : Job ID c0d72cb1d044417b8483ee436564bb7a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1531_1" data-parent="#job_list___sub_accordion_1531" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1531_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=319" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (319, 52), end pos: (319, 53)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 8</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -316,7 +316,7 @@ names = doc.embfile_names() if self._EMBED_NAME in names: file_bytes = doc.embfile_get(self._EMBED_NAME) - if isinstance(file_bytes, bytes | bytearray): + if isinstance(file_bytes, bytes &lt;&lt; bytearray): return bytes(file_bytes) except Exception as exc: logger.debug("Failed to extract embedded manifest: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%]</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1532"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1532_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1532_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1532_1"><button class="btn btn-outline-success"><span class="job_id">1532 : Job ID 58d4f734b8864f99866856debe7a54d1</span></button></div></a><div aria-labelledby="job_list___sub_heading_1532_1" data-parent="#job_list___sub_accordion_1532" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1532_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=77" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (77, 26), end pos: (77, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -74,7 +74,7 @@ pdf: PdfSource, secret: str, key: str, - intended_for: str | None = None, + intended_for: str &amp; None = None, position: str | None = None, ) -&gt; bytes: if not HAS_PYMUPDF:</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e98b2de62855f1c76: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.96s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1533"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1533_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1533_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1533_1"><button class="btn btn-outline-success"><span class="job_id">1533 : Job ID b8e690d5c9db414891f7ec611b1d6f88</span></button></div></a><div aria-labelledby="job_list___sub_heading_1533_1" data-parent="#job_list___sub_accordion_1533" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1533_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=78" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (78, 22), end pos: (78, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -75,7 +75,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str &amp; None = None, ) -&gt; bytes: if not HAS_PYMUPDF: raise WatermarkingError("PyMuPDF is required for this watermark method")</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T154118254524Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T154119119827Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.40s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1534"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1534_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1534_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1534_1"><button class="btn btn-outline-success"><span class="job_id">1534 : Job ID c67526bdb7924e48a63093ee401709d6</span></button></div></a><div aria-labelledby="job_list___sub_heading_1534_1" data-parent="#job_list___sub_accordion_1534" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1534_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=161" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (161, 22), end pos: (161, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -158,7 +158,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str &amp; None = None, ) -&gt; bool: if not HAS_PYMUPDF: return False</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T055249693094Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T055250545977Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.80s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1535"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1535_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1535_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1535_1"><button class="btn btn-outline-danger"><span class="job_id">1535 : Job ID e74c88deec414bf6bca3dc12d2d3bae0</span></button></div></a><div aria-labelledby="job_list___sub_heading_1535_1" data-parent="#job_list___sub_accordion_1535" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1535_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=233" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (233, 61), end pos: (233, 62)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -230,7 +230,7 @@ # Internal helpers # --------------------- def _derive_key( - self, password: str, salt: bytes, iter_override: int | None = None + self, password: str, salt: bytes, iter_override: int &amp; None = None ) -&gt; bytes: kdf = PBKDF2HMAC( algorithm=hashes.SHA256(),</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.58s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1536"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1536_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1536_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1536_1"><button class="btn btn-outline-danger"><span class="job_id">1536 : Job ID fe10a4fe24f742b9a67e675ae0d61265</span></button></div></a><div aria-labelledby="job_list___sub_heading_1536_1" data-parent="#job_list___sub_accordion_1536" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1536_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=282" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (282, 26), end pos: (282, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -279,7 +279,7 @@ annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64) - flags = 1 | 2 | 32 | 64 + flags = 1 &amp; 2 | 32 | 64 annot.set_flags(flags) except Exception as exc: logger.debug("Setting annotation flags failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.33s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1537"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1537_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1537_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1537_1"><button class="btn btn-outline-success"><span class="job_id">1537 : Job ID f3900848bc3342e6a53a801ab378092a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1537_1" data-parent="#job_list___sub_accordion_1537" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1537_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=282" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (282, 30), end pos: (282, 31)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -279,7 +279,7 @@ annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64) - flags = 1 | 2 | 32 | 64 + flags = 1 | 2 &amp; 32 | 64 annot.set_flags(flags) except Exception as exc: logger.debug("Setting annotation flags failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T225241669275Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T225242585776Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.58s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1538"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1538_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1538_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1538_1"><button class="btn btn-outline-success"><span class="job_id">1538 : Job ID d744f6da09424fbeba365d596b64c1fb</span></button></div></a><div aria-labelledby="job_list___sub_heading_1538_1" data-parent="#job_list___sub_accordion_1538" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1538_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=282" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (282, 35), end pos: (282, 36)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -279,7 +279,7 @@ annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64) - flags = 1 | 2 | 32 | 64 + flags = 1 | 2 | 32 &amp; 64 annot.set_flags(flags) except Exception as exc: logger.debug("Setting annotation flags failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T035400084492Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T035401084854Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 20.67s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1539"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1539_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1539_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1539_1"><button class="btn btn-outline-danger"><span class="job_id">1539 : Job ID c727b7a20cce44da834333e85caab8b5</span></button></div></a><div aria-labelledby="job_list___sub_heading_1539_1" data-parent="#job_list___sub_accordion_1539" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1539_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=311" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (311, 64), end pos: (311, 65)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -308,7 +308,7 @@ logger.debug("Adding invisible annotation failed: %s", exc) return None - def _extract_manifest(self, doc: pymupdf.Document) -&gt; bytes | None: + def _extract_manifest(self, doc: pymupdf.Document) -&gt; bytes &amp; None: # Primary: embedded file logger = logging.getLogger(__name__) try:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.51s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1540"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1540_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1540_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1540_1"><button class="btn btn-outline-success"><span class="job_id">1540 : Job ID 576805969163490e8041865a43817e7c</span></button></div></a><div aria-labelledby="job_list___sub_heading_1540_1" data-parent="#job_list___sub_accordion_1540" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1540_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=319" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (319, 52), end pos: (319, 53)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 8</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -316,7 +316,7 @@ names = doc.embfile_names() if self._EMBED_NAME in names: file_bytes = doc.embfile_get(self._EMBED_NAME) - if isinstance(file_bytes, bytes | bytearray): + if isinstance(file_bytes, bytes &amp; bytearray): return bytes(file_bytes) except Exception as exc: logger.debug("Failed to extract embedded manifest: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T181942268404Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T181943170557Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.51s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1541"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1541_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1541_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1541_1"><button class="btn btn-outline-success"><span class="job_id">1541 : Job ID 7882ab73bdc3473aa38c80f614e8d080</span></button></div></a><div aria-labelledby="job_list___sub_heading_1541_1" data-parent="#job_list___sub_accordion_1541" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1541_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=77" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (77, 26), end pos: (77, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -74,7 +74,7 @@ pdf: PdfSource, secret: str, key: str, - intended_for: str | None = None, + intended_for: str ^ None = None, position: str | None = None, ) -&gt; bytes: if not HAS_PYMUPDF:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T054336737971Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T054337683345Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.96s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1542"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1542_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1542_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1542_1"><button class="btn btn-outline-danger"><span class="job_id">1542 : Job ID b293e7d667bf49bbb2377349d9c9ea71</span></button></div></a><div aria-labelledby="job_list___sub_heading_1542_1" data-parent="#job_list___sub_accordion_1542" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1542_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=78" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (78, 22), end pos: (78, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -75,7 +75,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str ^ None = None, ) -&gt; bytes: if not HAS_PYMUPDF: raise WatermarkingError("PyMuPDF is required for this watermark method")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.24s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1543"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1543_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1543_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1543_1"><button class="btn btn-outline-danger"><span class="job_id">1543 : Job ID 10d5614550134b3e865440ca41c13802</span></button></div></a><div aria-labelledby="job_list___sub_heading_1543_1" data-parent="#job_list___sub_accordion_1543" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1543_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=161" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (161, 22), end pos: (161, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -158,7 +158,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str ^ None = None, ) -&gt; bool: if not HAS_PYMUPDF: return False</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.19s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1544"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1544_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1544_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1544_1"><button class="btn btn-outline-danger"><span class="job_id">1544 : Job ID 8f09d125dbbe468195c683f5869d221d</span></button></div></a><div aria-labelledby="job_list___sub_heading_1544_1" data-parent="#job_list___sub_accordion_1544" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1544_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=233" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (233, 61), end pos: (233, 62)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -230,7 +230,7 @@ # Internal helpers # --------------------- def _derive_key( - self, password: str, salt: bytes, iter_override: int | None = None + self, password: str, salt: bytes, iter_override: int ^ None = None ) -&gt; bytes: kdf = PBKDF2HMAC( algorithm=hashes.SHA256(),</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.21s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1545"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1545_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1545_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1545_1"><button class="btn btn-outline-danger"><span class="job_id">1545 : Job ID f7845faaea3f4d8f87c4b228f7c1b5b1</span></button></div></a><div aria-labelledby="job_list___sub_heading_1545_1" data-parent="#job_list___sub_accordion_1545" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1545_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=282" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (282, 26), end pos: (282, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -279,7 +279,7 @@ annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64) - flags = 1 | 2 | 32 | 64 + flags = 1 ^ 2 | 32 | 64 annot.set_flags(flags) except Exception as exc: logger.debug("Setting annotation flags failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 22.10s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1546"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1546_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1546_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1546_1"><button class="btn btn-outline-danger"><span class="job_id">1546 : Job ID ef6b0396707c4fe888c07bb2061b0e02</span></button></div></a><div aria-labelledby="job_list___sub_heading_1546_1" data-parent="#job_list___sub_accordion_1546" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1546_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=282" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (282, 30), end pos: (282, 31)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -279,7 +279,7 @@ annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64) - flags = 1 | 2 | 32 | 64 + flags = 1 | 2 ^ 32 | 64 annot.set_flags(flags) except Exception as exc: logger.debug("Setting annotation flags failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.16s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1547"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1547_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1547_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1547_1"><button class="btn btn-outline-danger"><span class="job_id">1547 : Job ID a8383a699c944f8f8663665ec9fa4895</span></button></div></a><div aria-labelledby="job_list___sub_heading_1547_1" data-parent="#job_list___sub_accordion_1547" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1547_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=282" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (282, 35), end pos: (282, 36)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -279,7 +279,7 @@ annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64) - flags = 1 | 2 | 32 | 64 + flags = 1 | 2 | 32 ^ 64 annot.set_flags(flags) except Exception as exc: logger.debug("Setting annotation flags failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.37s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1548"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1548_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1548_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1548_1"><button class="btn btn-outline-success"><span class="job_id">1548 : Job ID 13678d451bae48949136d38e10cdb71b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1548_1" data-parent="#job_list___sub_accordion_1548" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1548_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=311" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (311, 64), end pos: (311, 65)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -308,7 +308,7 @@ logger.debug("Adding invisible annotation failed: %s", exc) return None - def _extract_manifest(self, doc: pymupdf.Document) -&gt; bytes | None: + def _extract_manifest(self, doc: pymupdf.Document) -&gt; bytes ^ None: # Primary: embedded file logger = logging.getLogger(__name__) try:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T034120584584Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T034121472508Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.33s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1549"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1549_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1549_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1549_1"><button class="btn btn-outline-success"><span class="job_id">1549 : Job ID 8bd00f46e641431dad4cd2915a349479</span></button></div></a><div aria-labelledby="job_list___sub_heading_1549_1" data-parent="#job_list___sub_accordion_1549" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1549_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=319" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (319, 52), end pos: (319, 53)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 8</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -316,7 +316,7 @@ names = doc.embfile_names() if self._EMBED_NAME in names: file_bytes = doc.embfile_get(self._EMBED_NAME) - if isinstance(file_bytes, bytes | bytearray): + if isinstance(file_bytes, bytes ^ bytearray): return bytes(file_bytes) except Exception as exc: logger.debug("Failed to extract embedded manifest: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%]</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1550"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1550_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1550_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1550_1"><button class="btn btn-outline-danger"><span class="job_id">1550 : Job ID 24b9a7379b1c4d0098622594a1e78560</span></button></div></a><div aria-labelledby="job_list___sub_heading_1550_1" data-parent="#job_list___sub_accordion_1550" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1550_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=99" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (99, 30), end pos: (99, 32)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_NotEq, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -96,7 +96,7 @@ logger = logging.getLogger(__name__) try: # Some minimal test PDFs may have no page tree; enforce at least one page. - if doc.page_count == 0: + if doc.page_count != 0: # Create a brand new document with a blank page instead logger.debug("Rebuilding minimal PDF to include a page") doc.close()</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.51s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1551"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1551_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1551_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1551_1"><button class="btn btn-outline-danger"><span class="job_id">1551 : Job ID 239c44917ff74a4aa19a7487d4971996</span></button></div></a><div aria-labelledby="job_list___sub_heading_1551_1" data-parent="#job_list___sub_accordion_1551" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1551_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=273" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (273, 30), end pos: (273, 32)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_NotEq, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -270,7 +270,7 @@ def _add_invisible_annotation(self, doc: pymupdf.Document, text: str) -&gt; None: logger = logging.getLogger(__name__) try: - if doc.page_count == 0: + if doc.page_count != 0: doc.new_page() page = doc.load_page(0) # Place near top-left (PDF origin is bottom-left)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.02s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1552"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1552_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1552_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1552_1"><button class="btn btn-outline-success"><span class="job_id">1552 : Job ID 70d6857bcd0d437cb0c4bf3d373c7bad</span></button></div></a><div aria-labelledby="job_list___sub_heading_1552_1" data-parent="#job_list___sub_accordion_1552" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1552_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=99" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (99, 30), end pos: (99, 32)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_Lt, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -96,7 +96,7 @@ logger = logging.getLogger(__name__) try: # Some minimal test PDFs may have no page tree; enforce at least one page. - if doc.page_count == 0: + if doc.page_count &lt; 0: # Create a brand new document with a blank page instead logger.debug("Rebuilding minimal PDF to include a page") doc.close()</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e2e814206813d54d4: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.81s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1553"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1553_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1553_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1553_1"><button class="btn btn-outline-danger"><span class="job_id">1553 : Job ID feddd65a7bc749bba1aefcd2d7a502e9</span></button></div></a><div aria-labelledby="job_list___sub_heading_1553_1" data-parent="#job_list___sub_accordion_1553" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1553_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=273" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (273, 30), end pos: (273, 32)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_Lt, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -270,7 +270,7 @@ def _add_invisible_annotation(self, doc: pymupdf.Document, text: str) -&gt; None: logger = logging.getLogger(__name__) try: - if doc.page_count == 0: + if doc.page_count &lt; 0: doc.new_page() page = doc.load_page(0) # Place near top-left (PDF origin is bottom-left)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.31s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1554"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1554_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1554_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1554_1"><button class="btn btn-outline-danger"><span class="job_id">1554 : Job ID bd4df6c506eb41aa8c3908370988e504</span></button></div></a><div aria-labelledby="job_list___sub_heading_1554_1" data-parent="#job_list___sub_accordion_1554" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1554_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=99" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (99, 30), end pos: (99, 32)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_LtE, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -96,7 +96,7 @@ logger = logging.getLogger(__name__) try: # Some minimal test PDFs may have no page tree; enforce at least one page. - if doc.page_count == 0: + if doc.page_count &lt;= 0: # Create a brand new document with a blank page instead logger.debug("Rebuilding minimal PDF to include a page") doc.close()</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.48s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1555"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1555_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1555_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1555_1"><button class="btn btn-outline-success"><span class="job_id">1555 : Job ID 8ff92149503d4e2ebd4036778c98efe0</span></button></div></a><div aria-labelledby="job_list___sub_heading_1555_1" data-parent="#job_list___sub_accordion_1555" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1555_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=273" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (273, 30), end pos: (273, 32)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_LtE, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -270,7 +270,7 @@ def _add_invisible_annotation(self, doc: pymupdf.Document, text: str) -&gt; None: logger = logging.getLogger(__name__) try: - if doc.page_count == 0: + if doc.page_count &lt;= 0: doc.new_page() page = doc.load_page(0) # Place near top-left (PDF origin is bottom-left)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T041450487260Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T041451731455Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 21.87s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1556"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1556_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1556_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1556_1"><button class="btn btn-outline-success"><span class="job_id">1556 : Job ID 9116ae6ba4d14a55bcfcbb4e9f1c5d86</span></button></div></a><div aria-labelledby="job_list___sub_heading_1556_1" data-parent="#job_list___sub_accordion_1556" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1556_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=99" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (99, 30), end pos: (99, 32)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_Gt, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -96,7 +96,7 @@ logger = logging.getLogger(__name__) try: # Some minimal test PDFs may have no page tree; enforce at least one page. - if doc.page_count == 0: + if doc.page_count &gt; 0: # Create a brand new document with a blank page instead logger.debug("Rebuilding minimal PDF to include a page") doc.close()</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T034347037207Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T034348023600Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 20.16s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1557"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1557_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1557_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1557_1"><button class="btn btn-outline-danger"><span class="job_id">1557 : Job ID 2227f44cc1b44c5588afed30d9c8c0e9</span></button></div></a><div aria-labelledby="job_list___sub_heading_1557_1" data-parent="#job_list___sub_accordion_1557" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1557_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=273" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (273, 30), end pos: (273, 32)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_Gt, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -270,7 +270,7 @@ def _add_invisible_annotation(self, doc: pymupdf.Document, text: str) -&gt; None: logger = logging.getLogger(__name__) try: - if doc.page_count == 0: + if doc.page_count &gt; 0: doc.new_page() page = doc.load_page(0) # Place near top-left (PDF origin is bottom-left)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.44s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1558"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1558_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1558_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1558_1"><button class="btn btn-outline-success"><span class="job_id">1558 : Job ID 28f978a6c6cd438cb511f30ed8aa8e2b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1558_1" data-parent="#job_list___sub_accordion_1558" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1558_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=99" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (99, 30), end pos: (99, 32)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_GtE, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -96,7 +96,7 @@ logger = logging.getLogger(__name__) try: # Some minimal test PDFs may have no page tree; enforce at least one page. - if doc.page_count == 0: + if doc.page_count &gt;= 0: # Create a brand new document with a blank page instead logger.debug("Rebuilding minimal PDF to include a page") doc.close()</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T201433179975Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T201434095801Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.89s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1559"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1559_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1559_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1559_1"><button class="btn btn-outline-danger"><span class="job_id">1559 : Job ID 754c87368fce447ba569e460e084e7f9</span></button></div></a><div aria-labelledby="job_list___sub_heading_1559_1" data-parent="#job_list___sub_accordion_1559" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1559_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=273" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (273, 30), end pos: (273, 32)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_GtE, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -270,7 +270,7 @@ def _add_invisible_annotation(self, doc: pymupdf.Document, text: str) -&gt; None: logger = logging.getLogger(__name__) try: - if doc.page_count == 0: + if doc.page_count &gt;= 0: doc.new_page() page = doc.load_page(0) # Place near top-left (PDF origin is bottom-left)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.09s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1560"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1560_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1560_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1560_1"><button class="btn btn-outline-danger"><span class="job_id">1560 : Job ID 47a7fa0718ec4daba7cd7cb64ee52c8d</span></button></div></a><div aria-labelledby="job_list___sub_heading_1560_1" data-parent="#job_list___sub_accordion_1560" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1560_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=343" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (343, 22), end pos: (343, 24)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_Eq, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -340,7 +340,7 @@ continue b = obj_str.encode("latin-1", "replace") actual = self._sha256(b) - if actual != expected: + if actual == expected: raise WatermarkingError( f"PDF appears tampered: object hash mismatch (xref {xref})" )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.84s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1561"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1561_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1561_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1561_1"><button class="btn btn-outline-danger"><span class="job_id">1561 : Job ID d37b07e54dba43b9be48be7424288796</span></button></div></a><div aria-labelledby="job_list___sub_heading_1561_1" data-parent="#job_list___sub_accordion_1561" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1561_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=343" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (343, 22), end pos: (343, 24)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_Lt, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -340,7 +340,7 @@ continue b = obj_str.encode("latin-1", "replace") actual = self._sha256(b) - if actual != expected: + if actual &lt; expected: raise WatermarkingError( f"PDF appears tampered: object hash mismatch (xref {xref})" )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.43s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1562"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1562_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1562_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1562_1"><button class="btn btn-outline-danger"><span class="job_id">1562 : Job ID 015342c258ae48b09521eac12975aeef</span></button></div></a><div aria-labelledby="job_list___sub_heading_1562_1" data-parent="#job_list___sub_accordion_1562" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1562_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=343" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (343, 22), end pos: (343, 24)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_LtE, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -340,7 +340,7 @@ continue b = obj_str.encode("latin-1", "replace") actual = self._sha256(b) - if actual != expected: + if actual &lt;= expected: raise WatermarkingError( f"PDF appears tampered: object hash mismatch (xref {xref})" )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.87s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1563"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1563_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1563_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1563_1"><button class="btn btn-outline-danger"><span class="job_id">1563 : Job ID 66e000285ffa4d84878367514625a0b7</span></button></div></a><div aria-labelledby="job_list___sub_heading_1563_1" data-parent="#job_list___sub_accordion_1563" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1563_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=343" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (343, 22), end pos: (343, 24)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_Gt, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -340,7 +340,7 @@ continue b = obj_str.encode("latin-1", "replace") actual = self._sha256(b) - if actual != expected: + if actual &gt; expected: raise WatermarkingError( f"PDF appears tampered: object hash mismatch (xref {xref})" )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.09s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1564"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1564_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1564_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1564_1"><button class="btn btn-outline-danger"><span class="job_id">1564 : Job ID 26119cf6826d46f98fe6cd5225c7f801</span></button></div></a><div aria-labelledby="job_list___sub_heading_1564_1" data-parent="#job_list___sub_accordion_1564" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1564_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=343" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (343, 22), end pos: (343, 24)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_GtE, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -340,7 +340,7 @@ continue b = obj_str.encode("latin-1", "replace") actual = self._sha256(b) - if actual != expected: + if actual &gt;= expected: raise WatermarkingError( f"PDF appears tampered: object hash mismatch (xref {xref})" )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.38s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1565"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1565_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1565_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1565_1"><button class="btn btn-outline-danger"><span class="job_id">1565 : Job ID 5338aa25770f442fa4af786558b00c80</span></button></div></a><div aria-labelledby="job_list___sub_heading_1565_1" data-parent="#job_list___sub_accordion_1565" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1565_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=343" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (343, 22), end pos: (343, 24)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_Is, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -340,7 +340,7 @@ continue b = obj_str.encode("latin-1", "replace") actual = self._sha256(b) - if actual != expected: + if actual is expected: raise WatermarkingError( f"PDF appears tampered: object hash mismatch (xref {xref})" )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.30s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1566"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1566_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1566_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1566_1"><button class="btn btn-outline-danger"><span class="job_id">1566 : Job ID 608152425fd54fb99127d3e670420339</span></button></div></a><div aria-labelledby="job_list___sub_heading_1566_1" data-parent="#job_list___sub_accordion_1566" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1566_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=343" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (343, 22), end pos: (343, 24)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_IsNot, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -340,7 +340,7 @@ continue b = obj_str.encode("latin-1", "replace") actual = self._sha256(b) - if actual != expected: + if actual is not expected: raise WatermarkingError( f"PDF appears tampered: object hash mismatch (xref {xref})" )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.99s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1567"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1567_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1567_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1567_1"><button class="btn btn-outline-success"><span class="job_id">1567 : Job ID 5f73d2a7ca3d468cae54aef9bdde6e57</span></button></div></a><div aria-labelledby="job_list___sub_heading_1567_1" data-parent="#job_list___sub_accordion_1567" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1567_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=264" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (264, 30), end pos: (264, 31)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Lt_Eq, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -261,7 +261,7 @@ if "/type /catalog" in lower or "/names" in lower: continue b = obj_str.encode("latin-1", "replace") - if len(b.strip()) &lt; 8: + if len(b.strip()) == 8: continue sha256 = self._sha256(b) out.append(_ObjectHash(xref=xref, sha256=sha256))</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%]</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1568"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1568_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1568_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1568_1"><button class="btn btn-outline-danger"><span class="job_id">1568 : Job ID ed79fea8268943a094ed0e0b3b279aec</span></button></div></a><div aria-labelledby="job_list___sub_heading_1568_1" data-parent="#job_list___sub_accordion_1568" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1568_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=264" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (264, 30), end pos: (264, 31)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Lt_NotEq, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -261,7 +261,7 @@ if "/type /catalog" in lower or "/names" in lower: continue b = obj_str.encode("latin-1", "replace") - if len(b.strip()) &lt; 8: + if len(b.strip()) != 8: continue sha256 = self._sha256(b) out.append(_ObjectHash(xref=xref, sha256=sha256))</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.44s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1569"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1569_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1569_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1569_1"><button class="btn btn-outline-danger"><span class="job_id">1569 : Job ID 96261dabc1664f398208b81ba919a570</span></button></div></a><div aria-labelledby="job_list___sub_heading_1569_1" data-parent="#job_list___sub_accordion_1569" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1569_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=264" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (264, 30), end pos: (264, 31)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Lt_LtE, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -261,7 +261,7 @@ if "/type /catalog" in lower or "/names" in lower: continue b = obj_str.encode("latin-1", "replace") - if len(b.strip()) &lt; 8: + if len(b.strip()) &lt;= 8: continue sha256 = self._sha256(b) out.append(_ObjectHash(xref=xref, sha256=sha256))</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.22s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1570"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1570_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1570_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1570_1"><button class="btn btn-outline-success"><span class="job_id">1570 : Job ID 749d6a78e2134df3a47be9271e0ce4a3</span></button></div></a><div aria-labelledby="job_list___sub_heading_1570_1" data-parent="#job_list___sub_accordion_1570" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1570_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=264" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (264, 30), end pos: (264, 31)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Lt_Gt, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -261,7 +261,7 @@ if "/type /catalog" in lower or "/names" in lower: continue b = obj_str.encode("latin-1", "replace") - if len(b.strip()) &lt; 8: + if len(b.strip()) &gt; 8: continue sha256 = self._sha256(b) out.append(_ObjectHash(xref=xref, sha256=sha256))</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e214f95b1b04e6c65: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.67s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1571"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1571_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1571_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1571_1"><button class="btn btn-outline-success"><span class="job_id">1571 : Job ID 47fa97646fc0442091722507c232f460</span></button></div></a><div aria-labelledby="job_list___sub_heading_1571_1" data-parent="#job_list___sub_accordion_1571" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1571_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=264" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (264, 30), end pos: (264, 31)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Lt_GtE, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -261,7 +261,7 @@ if "/type /catalog" in lower or "/names" in lower: continue b = obj_str.encode("latin-1", "replace") - if len(b.strip()) &lt; 8: + if len(b.strip()) &gt;= 8: continue sha256 = self._sha256(b) out.append(_ObjectHash(xref=xref, sha256=sha256))</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T054525430175Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T054526404579Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 20.31s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1572"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1572_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1572_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1572_1"><button class="btn btn-outline-success"><span class="job_id">1572 : Job ID 8bda59c2cf3f4a538e368916eb65bfe1</span></button></div></a><div aria-labelledby="job_list___sub_heading_1572_1" data-parent="#job_list___sub_accordion_1572" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1572_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=201" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (201, 26), end pos: (201, 28)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_LtE_Eq, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -198,7 +198,7 @@ iter_count = int(manifest.get("iter", self._PBKDF2_ITER)) # Limit to 300k iterations to prevent DoS attacks # triggered by excessive PBKDF2 computation - if iter_count &lt;= 0 or iter_count &gt; 300_000: + if iter_count == 0 or iter_count &gt; 300_000: raise WatermarkingError("Unreasonable PBKDF2 iteration count") key_bytes = self._derive_key(key, salt, iter_override=iter_count)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T050303056045Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T050303944199Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.80s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1573"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1573_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1573_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1573_1"><button class="btn btn-outline-success"><span class="job_id">1573 : Job ID ac63a87867a64c6eadf99004c7500cdc</span></button></div></a><div aria-labelledby="job_list___sub_heading_1573_1" data-parent="#job_list___sub_accordion_1573" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1573_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=201" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (201, 26), end pos: (201, 28)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_LtE_NotEq, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -198,7 +198,7 @@ iter_count = int(manifest.get("iter", self._PBKDF2_ITER)) # Limit to 300k iterations to prevent DoS attacks # triggered by excessive PBKDF2 computation - if iter_count &lt;= 0 or iter_count &gt; 300_000: + if iter_count != 0 or iter_count &gt; 300_000: raise WatermarkingError("Unreasonable PBKDF2 iteration count") key_bytes = self._derive_key(key, salt, iter_override=iter_count)</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e6c5385fb06ee253a: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.75s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1574"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1574_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1574_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1574_1"><button class="btn btn-outline-success"><span class="job_id">1574 : Job ID b9545ba60a1743f4bd2331c829336361</span></button></div></a><div aria-labelledby="job_list___sub_heading_1574_1" data-parent="#job_list___sub_accordion_1574" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1574_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=201" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (201, 26), end pos: (201, 28)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_LtE_Lt, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -198,7 +198,7 @@ iter_count = int(manifest.get("iter", self._PBKDF2_ITER)) # Limit to 300k iterations to prevent DoS attacks # triggered by excessive PBKDF2 computation - if iter_count &lt;= 0 or iter_count &gt; 300_000: + if iter_count &lt; 0 or iter_count &gt; 300_000: raise WatermarkingError("Unreasonable PBKDF2 iteration count") key_bytes = self._derive_key(key, salt, iter_override=iter_count)</pre></div><div class="alert alert-secondary"><pre class="diff">...F.......... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:228: in open request = self._request_from_builder_args(args, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:200: in _request_from_builder_args return builder.get_request() ^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:764: in get_request return cls(self.get_environ()) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:688: in get_environ input_stream, content_length, boundary = stream_encode_multipart( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:130: in stream_encode_multipart write_binary(encoder.send_event(Data(data=chunk, more_data=True))) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:81: in write_binary return stream.write(s) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... 1 failed, 13 passed, 22 warnings in 20.10s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1575"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1575_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1575_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1575_1"><button class="btn btn-outline-danger"><span class="job_id">1575 : Job ID 36a83321ebf44bc89e2b85aa6d924359</span></button></div></a><div aria-labelledby="job_list___sub_heading_1575_1" data-parent="#job_list___sub_accordion_1575" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1575_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=201" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (201, 26), end pos: (201, 28)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_LtE_Gt, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -198,7 +198,7 @@ iter_count = int(manifest.get("iter", self._PBKDF2_ITER)) # Limit to 300k iterations to prevent DoS attacks # triggered by excessive PBKDF2 computation - if iter_count &lt;= 0 or iter_count &gt; 300_000: + if iter_count &gt; 0 or iter_count &gt; 300_000: raise WatermarkingError("Unreasonable PBKDF2 iteration count") key_bytes = self._derive_key(key, salt, iter_override=iter_count)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.83s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1576"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1576_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1576_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1576_1"><button class="btn btn-outline-danger"><span class="job_id">1576 : Job ID fe777d83797241da850b718485a7d994</span></button></div></a><div aria-labelledby="job_list___sub_heading_1576_1" data-parent="#job_list___sub_accordion_1576" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1576_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=201" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (201, 26), end pos: (201, 28)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_LtE_GtE, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -198,7 +198,7 @@ iter_count = int(manifest.get("iter", self._PBKDF2_ITER)) # Limit to 300k iterations to prevent DoS attacks # triggered by excessive PBKDF2 computation - if iter_count &lt;= 0 or iter_count &gt; 300_000: + if iter_count &gt;= 0 or iter_count &gt; 300_000: raise WatermarkingError("Unreasonable PBKDF2 iteration count") key_bytes = self._derive_key(key, salt, iter_override=iter_count)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.56s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1577"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1577_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1577_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1577_1"><button class="btn btn-outline-danger"><span class="job_id">1577 : Job ID 0dcd9becc8c4447386c337b3053ce71a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1577_1" data-parent="#job_list___sub_accordion_1577" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1577_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=201" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (201, 45), end pos: (201, 46)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_Eq, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -198,7 +198,7 @@ iter_count = int(manifest.get("iter", self._PBKDF2_ITER)) # Limit to 300k iterations to prevent DoS attacks # triggered by excessive PBKDF2 computation - if iter_count &lt;= 0 or iter_count &gt; 300_000: + if iter_count &lt;= 0 or iter_count == 300_000: raise WatermarkingError("Unreasonable PBKDF2 iteration count") key_bytes = self._derive_key(key, salt, iter_override=iter_count)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.95s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1578"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1578_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1578_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1578_1"><button class="btn btn-outline-success"><span class="job_id">1578 : Job ID 03dffaee957b4cdda86886197a5f210c</span></button></div></a><div aria-labelledby="job_list___sub_heading_1578_1" data-parent="#job_list___sub_accordion_1578" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1578_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=201" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (201, 45), end pos: (201, 46)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_NotEq, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -198,7 +198,7 @@ iter_count = int(manifest.get("iter", self._PBKDF2_ITER)) # Limit to 300k iterations to prevent DoS attacks # triggered by excessive PBKDF2 computation - if iter_count &lt;= 0 or iter_count &gt; 300_000: + if iter_count &lt;= 0 or iter_count != 300_000: raise WatermarkingError("Unreasonable PBKDF2 iteration count") key_bytes = self._derive_key(key, salt, iter_override=iter_count)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T010949560547Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T010950526058Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.39s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1579"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1579_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1579_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1579_1"><button class="btn btn-outline-success"><span class="job_id">1579 : Job ID b6b0fbc14a9741e781a6a4cb7549dea1</span></button></div></a><div aria-labelledby="job_list___sub_heading_1579_1" data-parent="#job_list___sub_accordion_1579" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1579_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=201" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (201, 45), end pos: (201, 46)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_Lt, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -198,7 +198,7 @@ iter_count = int(manifest.get("iter", self._PBKDF2_ITER)) # Limit to 300k iterations to prevent DoS attacks # triggered by excessive PBKDF2 computation - if iter_count &lt;= 0 or iter_count &gt; 300_000: + if iter_count &lt;= 0 or iter_count &lt; 300_000: raise WatermarkingError("Unreasonable PBKDF2 iteration count") key_bytes = self._derive_key(key, salt, iter_override=iter_count)</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e7beca369256b3483: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.76s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1580"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1580_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1580_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1580_1"><button class="btn btn-outline-success"><span class="job_id">1580 : Job ID 3366172f072f441294debea683316ef2</span></button></div></a><div aria-labelledby="job_list___sub_heading_1580_1" data-parent="#job_list___sub_accordion_1580" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1580_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=201" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (201, 45), end pos: (201, 46)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_LtE, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -198,7 +198,7 @@ iter_count = int(manifest.get("iter", self._PBKDF2_ITER)) # Limit to 300k iterations to prevent DoS attacks # triggered by excessive PBKDF2 computation - if iter_count &lt;= 0 or iter_count &gt; 300_000: + if iter_count &lt;= 0 or iter_count &lt;= 300_000: raise WatermarkingError("Unreasonable PBKDF2 iteration count") key_bytes = self._derive_key(key, salt, iter_override=iter_count)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T232931655316Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T232932643628Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.28s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1581"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1581_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1581_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1581_1"><button class="btn btn-outline-success"><span class="job_id">1581 : Job ID 93d8b1f6c14c40398aa0aae72113e973</span></button></div></a><div aria-labelledby="job_list___sub_heading_1581_1" data-parent="#job_list___sub_accordion_1581" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1581_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=201" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (201, 45), end pos: (201, 46)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_GtE, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -198,7 +198,7 @@ iter_count = int(manifest.get("iter", self._PBKDF2_ITER)) # Limit to 300k iterations to prevent DoS attacks # triggered by excessive PBKDF2 computation - if iter_count &lt;= 0 or iter_count &gt; 300_000: + if iter_count &lt;= 0 or iter_count &gt;= 300_000: raise WatermarkingError("Unreasonable PBKDF2 iteration count") key_bytes = self._derive_key(key, salt, iter_override=iter_count)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T054940591987Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T054941610348Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.59s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1582"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1582_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1582_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1582_1"><button class="btn btn-outline-success"><span class="job_id">1582 : Job ID 70fed50af1634f8eabba74c4c7cc96ed</span></button></div></a><div aria-labelledby="job_list___sub_heading_1582_1" data-parent="#job_list___sub_accordion_1582" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1582_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=251" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (251, 24), end pos: (251, 26)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_GtE_Eq, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -248,7 +248,7 @@ except Exception: return out for xref in range(1, xref_len): - if len(out) &gt;= self._OBJ_SAMPLE_LIMIT: + if len(out) == self._OBJ_SAMPLE_LIMIT: break try: obj_str = doc.xref_object(xref, compressed=False) or ""</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T230556632047Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T230557495227Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.34s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1583"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1583_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1583_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1583_1"><button class="btn btn-outline-danger"><span class="job_id">1583 : Job ID 8b6715479fac418c99bf6f7cb6cac154</span></button></div></a><div aria-labelledby="job_list___sub_heading_1583_1" data-parent="#job_list___sub_accordion_1583" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1583_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=251" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (251, 24), end pos: (251, 26)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_GtE_NotEq, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -248,7 +248,7 @@ except Exception: return out for xref in range(1, xref_len): - if len(out) &gt;= self._OBJ_SAMPLE_LIMIT: + if len(out) != self._OBJ_SAMPLE_LIMIT: break try: obj_str = doc.xref_object(xref, compressed=False) or ""</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.20s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1584"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1584_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1584_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1584_1"><button class="btn btn-outline-danger"><span class="job_id">1584 : Job ID 3a7f89c0ac5544e6af15e424d0d0f5d8</span></button></div></a><div aria-labelledby="job_list___sub_heading_1584_1" data-parent="#job_list___sub_accordion_1584" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1584_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=251" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (251, 24), end pos: (251, 26)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_GtE_Lt, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -248,7 +248,7 @@ except Exception: return out for xref in range(1, xref_len): - if len(out) &gt;= self._OBJ_SAMPLE_LIMIT: + if len(out) &lt; self._OBJ_SAMPLE_LIMIT: break try: obj_str = doc.xref_object(xref, compressed=False) or ""</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.40s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1585"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1585_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1585_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1585_1"><button class="btn btn-outline-danger"><span class="job_id">1585 : Job ID 88346c875fbb455aad66f5cd93b064cf</span></button></div></a><div aria-labelledby="job_list___sub_heading_1585_1" data-parent="#job_list___sub_accordion_1585" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1585_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=251" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (251, 24), end pos: (251, 26)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_GtE_LtE, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -248,7 +248,7 @@ except Exception: return out for xref in range(1, xref_len): - if len(out) &gt;= self._OBJ_SAMPLE_LIMIT: + if len(out) &lt;= self._OBJ_SAMPLE_LIMIT: break try: obj_str = doc.xref_object(xref, compressed=False) or ""</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.88s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1586"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1586_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1586_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1586_1"><button class="btn btn-outline-danger"><span class="job_id">1586 : Job ID b48fcd04966049e59f0c17c1550c0a0a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1586_1" data-parent="#job_list___sub_accordion_1586" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1586_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=251" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (251, 24), end pos: (251, 26)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_GtE_Gt, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -248,7 +248,7 @@ except Exception: return out for xref in range(1, xref_len): - if len(out) &gt;= self._OBJ_SAMPLE_LIMIT: + if len(out) &gt; self._OBJ_SAMPLE_LIMIT: break try: obj_str = doc.xref_object(xref, compressed=False) or ""</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.13s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1587"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1587_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1587_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1587_1"><button class="btn btn-outline-danger"><span class="job_id">1587 : Job ID a3518839b4ef4ce3bd342e359237480f</span></button></div></a><div aria-labelledby="job_list___sub_heading_1587_1" data-parent="#job_list___sub_accordion_1587" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1587_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=251" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (251, 24), end pos: (251, 26)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_GtE_Is, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -248,7 +248,7 @@ except Exception: return out for xref in range(1, xref_len): - if len(out) &gt;= self._OBJ_SAMPLE_LIMIT: + if len(out) is self._OBJ_SAMPLE_LIMIT: break try: obj_str = doc.xref_object(xref, compressed=False) or ""</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.23s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1588"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1588_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1588_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1588_1"><button class="btn btn-outline-danger"><span class="job_id">1588 : Job ID cdc6c9f98b594fbc843817d683b9d95e</span></button></div></a><div aria-labelledby="job_list___sub_heading_1588_1" data-parent="#job_list___sub_accordion_1588" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1588_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=251" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (251, 24), end pos: (251, 26)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_GtE_IsNot, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -248,7 +248,7 @@ except Exception: return out for xref in range(1, xref_len): - if len(out) &gt;= self._OBJ_SAMPLE_LIMIT: + if len(out) is not self._OBJ_SAMPLE_LIMIT: break try: obj_str = doc.xref_object(xref, compressed=False) or ""</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.08s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1589"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1589_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1589_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1589_1"><button class="btn btn-outline-danger"><span class="job_id">1589 : Job ID 69eebb2975eb467fa81c95db46ea2009</span></button></div></a><div aria-labelledby="job_list___sub_heading_1589_1" data-parent="#job_list___sub_accordion_1589" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1589_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=187" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (187, 30), end pos: (187, 32)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Is_IsNot, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -184,7 +184,7 @@ doc = pymupdf.open(stream=data, filetype="pdf") try: manifest_bytes = self._extract_manifest(doc) - if manifest_bytes is None: + if manifest_bytes is not None: raise SecretNotFoundError("Signed annotation watermark not found") try:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.10s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1590"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1590_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1590_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1590_1"><button class="btn btn-outline-danger"><span class="job_id">1590 : Job ID e720fc37a94f4ca4b519cca3e0a32662</span></button></div></a><div aria-labelledby="job_list___sub_heading_1590_1" data-parent="#job_list___sub_accordion_1590" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1590_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=80" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (80, 11), end pos: (80, 14)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -77,7 +77,7 @@ intended_for: str | None = None, position: str | None = None, ) -&gt; bytes: - if not HAS_PYMUPDF: + if HAS_PYMUPDF: raise WatermarkingError("PyMuPDF is required for this watermark method") if not secret or not isinstance(secret, str): raise ValueError("Secret must be a non-empty string")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.51s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1591"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1591_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1591_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1591_1"><button class="btn btn-outline-danger"><span class="job_id">1591 : Job ID b1d09ff29d91433b9db2d16f7b0920b9</span></button></div></a><div aria-labelledby="job_list___sub_heading_1591_1" data-parent="#job_list___sub_accordion_1591" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1591_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=82" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (82, 11), end pos: (82, 14)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -79,7 +79,7 @@ ) -&gt; bytes: if not HAS_PYMUPDF: raise WatermarkingError("PyMuPDF is required for this watermark method") - if not secret or not isinstance(secret, str): + if secret or not isinstance(secret, str): raise ValueError("Secret must be a non-empty string") if not key or not isinstance(key, str): raise ValueError("Key must be a non-empty string")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.34s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1592"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1592_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1592_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1592_1"><button class="btn btn-outline-danger"><span class="job_id">1592 : Job ID ab41bac4136f4a65a0f59afb0fc65b27</span></button></div></a><div aria-labelledby="job_list___sub_heading_1592_1" data-parent="#job_list___sub_accordion_1592" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1592_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=82" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (82, 25), end pos: (82, 28)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -79,7 +79,7 @@ ) -&gt; bytes: if not HAS_PYMUPDF: raise WatermarkingError("PyMuPDF is required for this watermark method") - if not secret or not isinstance(secret, str): + if not secret or isinstance(secret, str): raise ValueError("Secret must be a non-empty string") if not key or not isinstance(key, str): raise ValueError("Key must be a non-empty string")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.59s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1593"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1593_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1593_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1593_1"><button class="btn btn-outline-success"><span class="job_id">1593 : Job ID b637dd285ccf4129a34a5c16aa50ad17</span></button></div></a><div aria-labelledby="job_list___sub_heading_1593_1" data-parent="#job_list___sub_accordion_1593" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1593_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=84" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (84, 11), end pos: (84, 14)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -81,7 +81,7 @@ raise WatermarkingError("PyMuPDF is required for this watermark method") if not secret or not isinstance(secret, str): raise ValueError("Secret must be a non-empty string") - if not key or not isinstance(key, str): + if key or not isinstance(key, str): raise ValueError("Key must be a non-empty string") original = load_pdf_bytes(pdf)</pre></div><div class="alert alert-secondary"><pre class="diff">...F.......... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... 1 failed, 13 passed, 22 warnings in 23.23s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1594"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1594_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1594_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1594_1"><button class="btn btn-outline-danger"><span class="job_id">1594 : Job ID d6c7adc810d24c3498ef236b6ab8ec3b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1594_1" data-parent="#job_list___sub_accordion_1594" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1594_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=84" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (84, 22), end pos: (84, 25)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -81,7 +81,7 @@ raise WatermarkingError("PyMuPDF is required for this watermark method") if not secret or not isinstance(secret, str): raise ValueError("Secret must be a non-empty string") - if not key or not isinstance(key, str): + if not key or isinstance(key, str): raise ValueError("Key must be a non-empty string") original = load_pdf_bytes(pdf)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.38s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1595"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1595_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1595_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1595_1"><button class="btn btn-outline-danger"><span class="job_id">1595 : Job ID 2c1f18d626874db4a3510f355ef02243</span></button></div></a><div aria-labelledby="job_list___sub_heading_1595_1" data-parent="#job_list___sub_accordion_1595" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1595_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=163" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (163, 11), end pos: (163, 14)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -160,7 +160,7 @@ pdf: PdfSource, position: str | None = None, ) -&gt; bool: - if not HAS_PYMUPDF: + if HAS_PYMUPDF: return False try: b = load_pdf_bytes(pdf)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.46s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1596"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1596_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1596_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1596_1"><button class="btn btn-outline-success"><span class="job_id">1596 : Job ID df2cadc4ea2a40d988c7292ab6002c1b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1596_1" data-parent="#job_list___sub_accordion_1596" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1596_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=178" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (178, 11), end pos: (178, 14)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -175,7 +175,7 @@ return True def read_secret(self, pdf: PdfSource, key: str) -&gt; str: - if not HAS_PYMUPDF: + if HAS_PYMUPDF: raise WatermarkingError("PyMuPDF is required for this watermark method") if not key or not isinstance(key, str): raise ValueError("Key must be a non-empty string")</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T053352333290Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T053353164217Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.28s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1597"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1597_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1597_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1597_1"><button class="btn btn-outline-danger"><span class="job_id">1597 : Job ID c389bbcbdf7b4e82904c654c9583d2a6</span></button></div></a><div aria-labelledby="job_list___sub_heading_1597_1" data-parent="#job_list___sub_accordion_1597" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1597_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=180" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (180, 11), end pos: (180, 14)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -177,7 +177,7 @@ def read_secret(self, pdf: PdfSource, key: str) -&gt; str: if not HAS_PYMUPDF: raise WatermarkingError("PyMuPDF is required for this watermark method") - if not key or not isinstance(key, str): + if key or not isinstance(key, str): raise ValueError("Key must be a non-empty string") data = load_pdf_bytes(pdf)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.16s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1598"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1598_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1598_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1598_1"><button class="btn btn-outline-danger"><span class="job_id">1598 : Job ID 00526395594a47d58bd59b6eee9fecc6</span></button></div></a><div aria-labelledby="job_list___sub_heading_1598_1" data-parent="#job_list___sub_accordion_1598" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1598_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=180" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (180, 22), end pos: (180, 25)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 8</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -177,7 +177,7 @@ def read_secret(self, pdf: PdfSource, key: str) -&gt; str: if not HAS_PYMUPDF: raise WatermarkingError("PyMuPDF is required for this watermark method") - if not key or not isinstance(key, str): + if not key or isinstance(key, str): raise ValueError("Key must be a non-empty string") data = load_pdf_bytes(pdf)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.34s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1599"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1599_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1599_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1599_1"><button class="btn btn-outline-danger"><span class="job_id">1599 : Job ID 8980c6b3a29949a189f29255eff06b28</span></button></div></a><div aria-labelledby="job_list___sub_heading_1599_1" data-parent="#job_list___sub_accordion_1599" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1599_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=219" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (219, 15), end pos: (219, 18)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 9</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -216,7 +216,7 @@ raise SecretNotFoundError("Corrupted decrypted payload") from exc # Validate structure - if not (isinstance(payload, dict) and payload.get("secret")): + if (isinstance(payload, dict) and payload.get("secret")): raise SecretNotFoundError("Decrypted payload missing secret field") # Tamper check: recompute each hashed object</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.70s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1600"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1600_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1600_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1600_1"><button class="btn btn-outline-success"><span class="job_id">1600 : Job ID de26176a09794d50a06f82f68ca8b3bf</span></button></div></a><div aria-labelledby="job_list___sub_heading_1600_1" data-parent="#job_list___sub_accordion_1600" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1600_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=80" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (80, 11), end pos: (80, 26)</button></a></pre><pre>operator: core/AddNot, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -77,7 +77,7 @@ intended_for: str | None = None, position: str | None = None, ) -&gt; bytes: - if not HAS_PYMUPDF: + if not not HAS_PYMUPDF: raise WatermarkingError("PyMuPDF is required for this watermark method") if not secret or not isinstance(secret, str): raise ValueError("Secret must be a non-empty string")</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T170741762950Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T170742617586Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.09s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1601"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1601_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1601_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1601_1"><button class="btn btn-outline-success"><span class="job_id">1601 : Job ID 9128951f802348fe96fac20068246159</span></button></div></a><div aria-labelledby="job_list___sub_heading_1601_1" data-parent="#job_list___sub_accordion_1601" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1601_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=82" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (82, 11), end pos: (82, 52)</button></a></pre><pre>operator: core/AddNot, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -79,7 +79,7 @@ ) -&gt; bytes: if not HAS_PYMUPDF: raise WatermarkingError("PyMuPDF is required for this watermark method") - if not secret or not isinstance(secret, str): + if not not secret or not isinstance(secret, str): raise ValueError("Secret must be a non-empty string") if not key or not isinstance(key, str): raise ValueError("Key must be a non-empty string")</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 4 failed, 10 passed, 22 warnings in 22.19s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1602"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1602_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1602_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1602_1"><button class="btn btn-outline-success"><span class="job_id">1602 : Job ID aac7e59f45784315bd6fa18f83ccbc24</span></button></div></a><div aria-labelledby="job_list___sub_heading_1602_1" data-parent="#job_list___sub_accordion_1602" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1602_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=84" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (84, 11), end pos: (84, 46)</button></a></pre><pre>operator: core/AddNot, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -81,7 +81,7 @@ raise WatermarkingError("PyMuPDF is required for this watermark method") if not secret or not isinstance(secret, str): raise ValueError("Secret must be a non-empty string") - if not key or not isinstance(key, str): + if not not key or not isinstance(key, str): raise ValueError("Key must be a non-empty string") original = load_pdf_bytes(pdf)</pre></div><div class="alert alert-secondary"><pre class="diff">...F.......... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:228: in open request = self._request_from_builder_args(args, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:200: in _request_from_builder_args return builder.get_request() ^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:764: in get_request return cls(self.get_environ()) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:688: in get_environ input_stream, content_length, boundary = stream_encode_multipart( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:130: in stream_encode_multipart write_binary(encoder.send_event(Data(data=chunk, more_data=True))) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:81: in write_binary return stream.write(s) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... 1 failed, 13 passed, 22 warnings in 21.25s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1603"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1603_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1603_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1603_1"><button class="btn btn-outline-danger"><span class="job_id">1603 : Job ID 583850272cf64be88589f255f1a39431</span></button></div></a><div aria-labelledby="job_list___sub_heading_1603_1" data-parent="#job_list___sub_accordion_1603" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1603_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=99" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (99, 15), end pos: (99, 34)</button></a></pre><pre>operator: core/AddNot, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -96,7 +96,7 @@ logger = logging.getLogger(__name__) try: # Some minimal test PDFs may have no page tree; enforce at least one page. - if doc.page_count == 0: + if not doc.page_count == 0: # Create a brand new document with a blank page instead logger.debug("Rebuilding minimal PDF to include a page") doc.close()</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.93s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1604"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1604_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1604_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1604_1"><button class="btn btn-outline-danger"><span class="job_id">1604 : Job ID cc32c86373854a53987b566468813ae4</span></button></div></a><div aria-labelledby="job_list___sub_heading_1604_1" data-parent="#job_list___sub_accordion_1604" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1604_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=132" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (132, 19), end pos: (135, 17)</button></a></pre><pre>operator: core/AddNot, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -129,7 +129,7 @@ } manifest_bytes = json.dumps(manifest, separators=(",", ":")).encode("utf-8") try: - if ( + if not ( hasattr(doc, "_embfile_names") and self._EMBED_NAME in doc._embfile_names() ):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.41s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1605"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1605_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1605_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1605_1"><button class="btn btn-outline-success"><span class="job_id">1605 : Job ID 14ba653806d3441a87cd8eade6635925</span></button></div></a><div aria-labelledby="job_list___sub_heading_1605_1" data-parent="#job_list___sub_accordion_1605" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1605_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=140" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (140, 19), end pos: (140, 47)</button></a></pre><pre>operator: core/AddNot, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -137,7 +137,7 @@ except Exception as exc: logger.debug("Cleanup of existing embedded file failed: %s", exc) try: - if hasattr(doc, "_embfile_add"): + if not hasattr(doc, "_embfile_add"): doc.embfile_add( self._EMBED_NAME, manifest_bytes,</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T053553808087Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T053554796492Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 20.04s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1606"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1606_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1606_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1606_1"><button class="btn btn-outline-danger"><span class="job_id">1606 : Job ID 3a4bcfe06c8d43c9bf0857c35c44e988</span></button></div></a><div aria-labelledby="job_list___sub_heading_1606_1" data-parent="#job_list___sub_accordion_1606" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1606_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=163" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (163, 11), end pos: (163, 26)</button></a></pre><pre>operator: core/AddNot, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -160,7 +160,7 @@ pdf: PdfSource, position: str | None = None, ) -&gt; bool: - if not HAS_PYMUPDF: + if not not HAS_PYMUPDF: return False try: b = load_pdf_bytes(pdf)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.23s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1607"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1607_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1607_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1607_1"><button class="btn btn-outline-danger"><span class="job_id">1607 : Job ID cc4eb39aba524dfc93cd2259f840840d</span></button></div></a><div aria-labelledby="job_list___sub_heading_1607_1" data-parent="#job_list___sub_accordion_1607" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1607_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=178" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (178, 11), end pos: (178, 26)</button></a></pre><pre>operator: core/AddNot, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -175,7 +175,7 @@ return True def read_secret(self, pdf: PdfSource, key: str) -&gt; str: - if not HAS_PYMUPDF: + if not not HAS_PYMUPDF: raise WatermarkingError("PyMuPDF is required for this watermark method") if not key or not isinstance(key, str): raise ValueError("Key must be a non-empty string")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.16s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1608"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1608_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1608_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1608_1"><button class="btn btn-outline-danger"><span class="job_id">1608 : Job ID 4b327ec8431e4717acf0e1c665eafc76</span></button></div></a><div aria-labelledby="job_list___sub_heading_1608_1" data-parent="#job_list___sub_accordion_1608" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1608_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=180" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (180, 11), end pos: (180, 46)</button></a></pre><pre>operator: core/AddNot, occurrence: 8</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -177,7 +177,7 @@ def read_secret(self, pdf: PdfSource, key: str) -&gt; str: if not HAS_PYMUPDF: raise WatermarkingError("PyMuPDF is required for this watermark method") - if not key or not isinstance(key, str): + if not not key or not isinstance(key, str): raise ValueError("Key must be a non-empty string") data = load_pdf_bytes(pdf)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.05s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1609"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1609_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1609_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1609_1"><button class="btn btn-outline-danger"><span class="job_id">1609 : Job ID 52e30a6f5ddf4643a19fffa56616539a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1609_1" data-parent="#job_list___sub_accordion_1609" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1609_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=187" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (187, 15), end pos: (187, 37)</button></a></pre><pre>operator: core/AddNot, occurrence: 9</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -184,7 +184,7 @@ doc = pymupdf.open(stream=data, filetype="pdf") try: manifest_bytes = self._extract_manifest(doc) - if manifest_bytes is None: + if not manifest_bytes is None: raise SecretNotFoundError("Signed annotation watermark not found") try:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.02s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1610"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1610_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1610_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1610_1"><button class="btn btn-outline-success"><span class="job_id">1610 : Job ID 5ede5ae1704a432997185931281ac519</span></button></div></a><div aria-labelledby="job_list___sub_heading_1610_1" data-parent="#job_list___sub_accordion_1610" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1610_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=201" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (201, 15), end pos: (201, 54)</button></a></pre><pre>operator: core/AddNot, occurrence: 10</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -198,7 +198,7 @@ iter_count = int(manifest.get("iter", self._PBKDF2_ITER)) # Limit to 300k iterations to prevent DoS attacks # triggered by excessive PBKDF2 computation - if iter_count &lt;= 0 or iter_count &gt; 300_000: + if not iter_count &lt;= 0 or iter_count &gt; 300_000: raise WatermarkingError("Unreasonable PBKDF2 iteration count") key_bytes = self._derive_key(key, salt, iter_override=iter_count)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T152454336938Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T152455184204Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.13s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1611"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1611_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1611_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1611_1"><button class="btn btn-outline-success"><span class="job_id">1611 : Job ID 2968ed257ad143db9264268714f7c6a5</span></button></div></a><div aria-labelledby="job_list___sub_heading_1611_1" data-parent="#job_list___sub_accordion_1611" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1611_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=219" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (219, 15), end pos: (219, 72)</button></a></pre><pre>operator: core/AddNot, occurrence: 11</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -216,7 +216,7 @@ raise SecretNotFoundError("Corrupted decrypted payload") from exc # Validate structure - if not (isinstance(payload, dict) and payload.get("secret")): + if not not (isinstance(payload, dict) and payload.get("secret")): raise SecretNotFoundError("Decrypted payload missing secret field") # Tamper check: recompute each hashed object</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T155745887170Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T155746816161Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.34s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1612"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1612_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1612_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1612_1"><button class="btn btn-outline-success"><span class="job_id">1612 : Job ID d8c87fc1da8c47529f419d99298ce9e6</span></button></div></a><div aria-labelledby="job_list___sub_heading_1612_1" data-parent="#job_list___sub_accordion_1612" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1612_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=251" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (251, 15), end pos: (251, 49)</button></a></pre><pre>operator: core/AddNot, occurrence: 12</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -248,7 +248,7 @@ except Exception: return out for xref in range(1, xref_len): - if len(out) &gt;= self._OBJ_SAMPLE_LIMIT: + if not len(out) &gt;= self._OBJ_SAMPLE_LIMIT: break try: obj_str = doc.xref_object(xref, compressed=False) or ""</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T172249183133Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T172250135417Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.44s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1613"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1613_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1613_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1613_1"><button class="btn btn-outline-success"><span class="job_id">1613 : Job ID 0e680ac0bf3b4f29a11df5c7f861e318</span></button></div></a><div aria-labelledby="job_list___sub_heading_1613_1" data-parent="#job_list___sub_accordion_1613" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1613_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=261" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (261, 15), end pos: (261, 61)</button></a></pre><pre>operator: core/AddNot, occurrence: 13</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -258,7 +258,7 @@ ) continue lower = obj_str.lower() - if "/type /catalog" in lower or "/names" in lower: + if not "/type /catalog" in lower or "/names" in lower: continue b = obj_str.encode("latin-1", "replace") if len(b.strip()) &lt; 8:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T054212791597Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T054213736642Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.59s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1614"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1614_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1614_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1614_1"><button class="btn btn-outline-danger"><span class="job_id">1614 : Job ID 5f480c94cdec413589355323fb872665</span></button></div></a><div aria-labelledby="job_list___sub_heading_1614_1" data-parent="#job_list___sub_accordion_1614" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1614_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=264" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (264, 15), end pos: (264, 33)</button></a></pre><pre>operator: core/AddNot, occurrence: 14</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -261,7 +261,7 @@ if "/type /catalog" in lower or "/names" in lower: continue b = obj_str.encode("latin-1", "replace") - if len(b.strip()) &lt; 8: + if not len(b.strip()) &lt; 8: continue sha256 = self._sha256(b) out.append(_ObjectHash(xref=xref, sha256=sha256))</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.18s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1615"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1615_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1615_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1615_1"><button class="btn btn-outline-danger"><span class="job_id">1615 : Job ID 141fd9d581694c70a2adb1d783df34f1</span></button></div></a><div aria-labelledby="job_list___sub_heading_1615_1" data-parent="#job_list___sub_accordion_1615" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1615_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=273" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (273, 15), end pos: (273, 34)</button></a></pre><pre>operator: core/AddNot, occurrence: 15</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -270,7 +270,7 @@ def _add_invisible_annotation(self, doc: pymupdf.Document, text: str) -&gt; None: logger = logging.getLogger(__name__) try: - if doc.page_count == 0: + if not doc.page_count == 0: doc.new_page() page = doc.load_page(0) # Place near top-left (PDF origin is bottom-left)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.98s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1616"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1616_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1616_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1616_1"><button class="btn btn-outline-success"><span class="job_id">1616 : Job ID b9d9f866624349ef917732fec2367d05</span></button></div></a><div aria-labelledby="job_list___sub_heading_1616_1" data-parent="#job_list___sub_accordion_1616" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1616_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=288" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (288, 19), end pos: (288, 45)</button></a></pre><pre>operator: core/AddNot, occurrence: 16</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -285,7 +285,7 @@ logger.debug("Setting annotation flags failed: %s", exc) try: # Ensure it is not auto-open - if hasattr(annot, "set_open"): + if not hasattr(annot, "set_open"): annot.set_open(False) except Exception as exc: logger.debug("Setting annotation open state failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T141603599388Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T141604499296Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.30s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1617"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1617_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1617_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1617_1"><button class="btn btn-outline-danger"><span class="job_id">1617 : Job ID 81499fe1dc604e1996c911271d477edd</span></button></div></a><div aria-labelledby="job_list___sub_heading_1617_1" data-parent="#job_list___sub_accordion_1617" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1617_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=315" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (315, 15), end pos: (315, 45)</button></a></pre><pre>operator: core/AddNot, occurrence: 17</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -312,7 +312,7 @@ # Primary: embedded file logger = logging.getLogger(__name__) try: - if hasattr(doc, "_embfile_names"): + if not hasattr(doc, "_embfile_names"): names = doc.embfile_names() if self._EMBED_NAME in names: file_bytes = doc.embfile_get(self._EMBED_NAME)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.66s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1618"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1618_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1618_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1618_1"><button class="btn btn-outline-success"><span class="job_id">1618 : Job ID 5dec9cb8661a4a139d12afca6f9c2b77</span></button></div></a><div aria-labelledby="job_list___sub_heading_1618_1" data-parent="#job_list___sub_accordion_1618" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1618_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=317" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (317, 19), end pos: (317, 44)</button></a></pre><pre>operator: core/AddNot, occurrence: 18</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -314,7 +314,7 @@ try: if hasattr(doc, "_embfile_names"): names = doc.embfile_names() - if self._EMBED_NAME in names: + if not self._EMBED_NAME in names: file_bytes = doc.embfile_get(self._EMBED_NAME) if isinstance(file_bytes, bytes | bytearray): return bytes(file_bytes)</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....F...F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e1800777982f26693: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 3 failed, 11 passed, 22 warnings in 20.34s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1619"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1619_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1619_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1619_1"><button class="btn btn-outline-danger"><span class="job_id">1619 : Job ID 0d4069a9c1e04fa3b56a49aeabe55938</span></button></div></a><div aria-labelledby="job_list___sub_heading_1619_1" data-parent="#job_list___sub_accordion_1619" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1619_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=319" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (319, 23), end pos: (319, 64)</button></a></pre><pre>operator: core/AddNot, occurrence: 19</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -316,7 +316,7 @@ names = doc.embfile_names() if self._EMBED_NAME in names: file_bytes = doc.embfile_get(self._EMBED_NAME) - if isinstance(file_bytes, bytes | bytearray): + if not isinstance(file_bytes, bytes | bytearray): return bytes(file_bytes) except Exception as exc: logger.debug("Failed to extract embedded manifest: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.21s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1620"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1620_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1620_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1620_1"><button class="btn btn-outline-danger"><span class="job_id">1620 : Job ID ca47bd020722458fae46da587f261154</span></button></div></a><div aria-labelledby="job_list___sub_heading_1620_1" data-parent="#job_list___sub_accordion_1620" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1620_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=339" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (339, 15), end pos: (339, 61)</button></a></pre><pre>operator: core/AddNot, occurrence: 20</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -336,7 +336,7 @@ "Referenced object missing (tampered)" ) from None lower = obj_str.lower() - if "/type /catalog" in lower or "/names" in lower: + if not "/type /catalog" in lower or "/names" in lower: continue b = obj_str.encode("latin-1", "replace") actual = self._sha256(b)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.15s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1621"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1621_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1621_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1621_1"><button class="btn btn-outline-danger"><span class="job_id">1621 : Job ID 826e171aaff942a9943ff748a4a411eb</span></button></div></a><div aria-labelledby="job_list___sub_heading_1621_1" data-parent="#job_list___sub_accordion_1621" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1621_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=343" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (343, 15), end pos: (343, 33)</button></a></pre><pre>operator: core/AddNot, occurrence: 21</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -340,7 +340,7 @@ continue b = obj_str.encode("latin-1", "replace") actual = self._sha256(b) - if actual != expected: + if not actual != expected: raise WatermarkingError( f"PDF appears tampered: object hash mismatch (xref {xref})" )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.50s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1622"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1622_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1622_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1622_1"><button class="btn btn-outline-success"><span class="job_id">1622 : Job ID e4efbd900472475799cc22fac1dbb9d6</span></button></div></a><div aria-labelledby="job_list___sub_heading_1622_1" data-parent="#job_list___sub_accordion_1622" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1622_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=39" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (39, 18), end pos: (39, 22)</button></a></pre><pre>operator: core/ReplaceTrueWithFalse, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -36,7 +36,7 @@ try: # PyMuPDF is required for all operations of this method import pymupdf - HAS_PYMUPDF = True + HAS_PYMUPDF = False except Exception: HAS_PYMUPDF = False </pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T022718652206Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T022719591310Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.30s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1623"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1623_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1623_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1623_1"><button class="btn btn-outline-danger"><span class="job_id">1623 : Job ID 21f92df35cee43e7b307879104832c4c</span></button></div></a><div aria-labelledby="job_list___sub_heading_1623_1" data-parent="#job_list___sub_accordion_1623" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1623_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=175" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (175, 15), end pos: (175, 19)</button></a></pre><pre>operator: core/ReplaceTrueWithFalse, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -172,7 +172,7 @@ doc.close() except Exception as exc: logging.getLogger(__name__).debug("Closing document failed: %s", exc) - return True + return False def read_secret(self, pdf: PdfSource, key: str) -&gt; str: if not HAS_PYMUPDF:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.38s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1624"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1624_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1624_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1624_1"><button class="btn btn-outline-danger"><span class="job_id">1624 : Job ID afa58528db8c4fdda4199abc77626301</span></button></div></a><div aria-labelledby="job_list___sub_heading_1624_1" data-parent="#job_list___sub_accordion_1624" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1624_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=41" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (41, 18), end pos: (41, 23)</button></a></pre><pre>operator: core/ReplaceFalseWithTrue, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -38,7 +38,7 @@ HAS_PYMUPDF = True except Exception: - HAS_PYMUPDF = False + HAS_PYMUPDF = True @dataclass</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.08s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1625"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1625_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1625_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1625_1"><button class="btn btn-outline-danger"><span class="job_id">1625 : Job ID bdbb233d68f642eba1be617b5e3967e0</span></button></div></a><div aria-labelledby="job_list___sub_heading_1625_1" data-parent="#job_list___sub_accordion_1625" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1625_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=164" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (164, 19), end pos: (164, 24)</button></a></pre><pre>operator: core/ReplaceFalseWithTrue, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -161,7 +161,7 @@ position: str | None = None, ) -&gt; bool: if not HAS_PYMUPDF: - return False + return True try: b = load_pdf_bytes(pdf) doc = pymupdf.open(stream=b, filetype="pdf")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.37s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1626"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1626_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1626_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1626_1"><button class="btn btn-outline-danger"><span class="job_id">1626 : Job ID d1be4a3becd944c78f8db8422080f710</span></button></div></a><div aria-labelledby="job_list___sub_heading_1626_1" data-parent="#job_list___sub_accordion_1626" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1626_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=169" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (169, 19), end pos: (169, 24)</button></a></pre><pre>operator: core/ReplaceFalseWithTrue, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -166,7 +166,7 @@ b = load_pdf_bytes(pdf) doc = pymupdf.open(stream=b, filetype="pdf") except Exception: - return False + return True finally: try: doc.close()</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.58s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1627"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1627_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1627_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1627_1"><button class="btn btn-outline-danger"><span class="job_id">1627 : Job ID 6df0e786bf864986aaafcc028937b6ce</span></button></div></a><div aria-labelledby="job_list___sub_heading_1627_1" data-parent="#job_list___sub_accordion_1627" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1627_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=254" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (254, 59), end pos: (254, 64)</button></a></pre><pre>operator: core/ReplaceFalseWithTrue, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -251,7 +251,7 @@ if len(out) &gt;= self._OBJ_SAMPLE_LIMIT: break try: - obj_str = doc.xref_object(xref, compressed=False) or "" + obj_str = doc.xref_object(xref, compressed=True) or "" except Exception as exc: logging.getLogger(__name__).debug( "Reading xref %s failed: %s", xref, exc</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.79s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1628"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1628_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1628_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1628_1"><button class="btn btn-outline-danger"><span class="job_id">1628 : Job ID 71c5d5d2077a46839e3a27c61713fda5</span></button></div></a><div aria-labelledby="job_list___sub_heading_1628_1" data-parent="#job_list___sub_accordion_1628" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1628_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=289" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (289, 35), end pos: (289, 40)</button></a></pre><pre>operator: core/ReplaceFalseWithTrue, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -286,7 +286,7 @@ try: # Ensure it is not auto-open if hasattr(annot, "set_open"): - annot.set_open(False) + annot.set_open(True) except Exception as exc: logger.debug("Setting annotation open state failed: %s", exc) try:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.83s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1629"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1629_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1629_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1629_1"><button class="btn btn-outline-danger"><span class="job_id">1629 : Job ID 90d1af7d71d54d8b9b639bbcd176c254</span></button></div></a><div aria-labelledby="job_list___sub_heading_1629_1" data-parent="#job_list___sub_accordion_1629" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1629_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=333" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (333, 59), end pos: (333, 64)</button></a></pre><pre>operator: core/ReplaceFalseWithTrue, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -330,7 +330,7 @@ except Exception: raise WatermarkingError("Malformed object hash entry") from None try: - obj_str = doc.xref_object(xref, compressed=False) or "" + obj_str = doc.xref_object(xref, compressed=True) or "" except Exception: raise WatermarkingError( "Referenced object missing (tampered)"</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.51s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1630"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1630_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1630_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1630_1"><button class="btn btn-outline-success"><span class="job_id">1630 : Job ID 3356a5104252434e91092813ce291a3b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1630_1" data-parent="#job_list___sub_accordion_1630" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1630_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=134" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (134, 20), end pos: (134, 23)</button></a></pre><pre>operator: core/ReplaceAndWithOr, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -131,7 +131,7 @@ try: if ( hasattr(doc, "_embfile_names") - and self._EMBED_NAME in doc._embfile_names() + or self._EMBED_NAME in doc._embfile_names() ): doc._embfile_del(self._EMBED_NAME) except Exception as exc:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T180516839421Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T180517772644Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.88s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1631"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1631_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1631_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1631_1"><button class="btn btn-outline-success"><span class="job_id">1631 : Job ID 230c4831feb74e6f8a5475ec3d343d61</span></button></div></a><div aria-labelledby="job_list___sub_heading_1631_1" data-parent="#job_list___sub_accordion_1631" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1631_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=219" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (219, 46), end pos: (219, 49)</button></a></pre><pre>operator: core/ReplaceAndWithOr, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -216,7 +216,7 @@ raise SecretNotFoundError("Corrupted decrypted payload") from exc # Validate structure - if not (isinstance(payload, dict) and payload.get("secret")): + if not (isinstance(payload, dict) or payload.get("secret")): raise SecretNotFoundError("Decrypted payload missing secret field") # Tamper check: recompute each hashed object</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T162230823028Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T162231711074Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.41s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1632"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1632_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1632_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1632_1"><button class="btn btn-outline-success"><span class="job_id">1632 : Job ID 0270d03852044a3e95a364e633c7e8b8</span></button></div></a><div aria-labelledby="job_list___sub_heading_1632_1" data-parent="#job_list___sub_accordion_1632" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1632_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=82" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (82, 22), end pos: (82, 24)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -79,7 +79,7 @@ ) -&gt; bytes: if not HAS_PYMUPDF: raise WatermarkingError("PyMuPDF is required for this watermark method") - if not secret or not isinstance(secret, str): + if not secret and not isinstance(secret, str): raise ValueError("Secret must be a non-empty string") if not key or not isinstance(key, str): raise ValueError("Key must be a non-empty string")</pre></div><div class="alert alert-secondary"><pre class="diff">...F.......... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:228: in open request = self._request_from_builder_args(args, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:200: in _request_from_builder_args return builder.get_request() ^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:764: in get_request return cls(self.get_environ()) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:688: in get_environ input_stream, content_length, boundary = stream_encode_multipart( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:130: in stream_encode_multipart write_binary(encoder.send_event(Data(data=chunk, more_data=True))) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:81: in write_binary return stream.write(s) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... 1 failed, 13 passed, 22 warnings in 21.50s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1633"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1633_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1633_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1633_1"><button class="btn btn-outline-success"><span class="job_id">1633 : Job ID f71a170e4d5c46c68e20e8bbeced9d41</span></button></div></a><div aria-labelledby="job_list___sub_heading_1633_1" data-parent="#job_list___sub_accordion_1633" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1633_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=84" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (84, 19), end pos: (84, 21)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -81,7 +81,7 @@ raise WatermarkingError("PyMuPDF is required for this watermark method") if not secret or not isinstance(secret, str): raise ValueError("Secret must be a non-empty string") - if not key or not isinstance(key, str): + if not key and not isinstance(key, str): raise ValueError("Key must be a non-empty string") original = load_pdf_bytes(pdf)</pre></div><div class="alert alert-secondary"><pre class="diff">...F.......... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:228: in open request = self._request_from_builder_args(args, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:200: in _request_from_builder_args return builder.get_request() ^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:764: in get_request return cls(self.get_environ()) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:688: in get_environ input_stream, content_length, boundary = stream_encode_multipart( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:130: in stream_encode_multipart write_binary(encoder.send_event(Data(data=chunk, more_data=True))) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:81: in write_binary return stream.write(s) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... 1 failed, 13 passed, 22 warnings in 20.62s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1634"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1634_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1634_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1634_1"><button class="btn btn-outline-success"><span class="job_id">1634 : Job ID 92ac4e0a102d4de2b98aec93f604c7a5</span></button></div></a><div aria-labelledby="job_list___sub_heading_1634_1" data-parent="#job_list___sub_accordion_1634" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1634_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=180" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (180, 19), end pos: (180, 21)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -177,7 +177,7 @@ def read_secret(self, pdf: PdfSource, key: str) -&gt; str: if not HAS_PYMUPDF: raise WatermarkingError("PyMuPDF is required for this watermark method") - if not key or not isinstance(key, str): + if not key and not isinstance(key, str): raise ValueError("Key must be a non-empty string") data = load_pdf_bytes(pdf)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T034243283108Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T034244219161Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.61s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1635"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1635_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1635_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1635_1"><button class="btn btn-outline-danger"><span class="job_id">1635 : Job ID 1b070b511d94496abab239bf3168855d</span></button></div></a><div aria-labelledby="job_list___sub_heading_1635_1" data-parent="#job_list___sub_accordion_1635" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1635_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=201" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (201, 31), end pos: (201, 33)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -198,7 +198,7 @@ iter_count = int(manifest.get("iter", self._PBKDF2_ITER)) # Limit to 300k iterations to prevent DoS attacks # triggered by excessive PBKDF2 computation - if iter_count &lt;= 0 or iter_count &gt; 300_000: + if iter_count &lt;= 0 and iter_count &gt; 300_000: raise WatermarkingError("Unreasonable PBKDF2 iteration count") key_bytes = self._derive_key(key, salt, iter_override=iter_count)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.89s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1636"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1636_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1636_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1636_1"><button class="btn btn-outline-danger"><span class="job_id">1636 : Job ID aaeb30dfafef487d892bab2beff15414</span></button></div></a><div aria-labelledby="job_list___sub_heading_1636_1" data-parent="#job_list___sub_accordion_1636" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1636_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=239" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (239, 37), end pos: (239, 39)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -236,7 +236,7 @@ algorithm=hashes.SHA256(), length=32, salt=salt, - iterations=iter_override or self._PBKDF2_ITER, + iterations=iter_override and self._PBKDF2_ITER, ) return kdf.derive(password.encode("utf-8")) </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.01s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1637"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1637_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1637_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1637_1"><button class="btn btn-outline-danger"><span class="job_id">1637 : Job ID fe83a4e565c342fca6e8ea94373f6996</span></button></div></a><div aria-labelledby="job_list___sub_heading_1637_1" data-parent="#job_list___sub_accordion_1637" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1637_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=254" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (254, 66), end pos: (254, 68)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -251,7 +251,7 @@ if len(out) &gt;= self._OBJ_SAMPLE_LIMIT: break try: - obj_str = doc.xref_object(xref, compressed=False) or "" + obj_str = doc.xref_object(xref, compressed=False) and "" except Exception as exc: logging.getLogger(__name__).debug( "Reading xref %s failed: %s", xref, exc</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.98s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1638"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1638_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1638_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1638_1"><button class="btn btn-outline-danger"><span class="job_id">1638 : Job ID 3c255d486e4f40ed8699381ca7a99d92</span></button></div></a><div aria-labelledby="job_list___sub_heading_1638_1" data-parent="#job_list___sub_accordion_1638" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1638_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=261" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (261, 41), end pos: (261, 43)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -258,7 +258,7 @@ ) continue lower = obj_str.lower() - if "/type /catalog" in lower or "/names" in lower: + if "/type /catalog" in lower and "/names" in lower: continue b = obj_str.encode("latin-1", "replace") if len(b.strip()) &lt; 8:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.51s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1639"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1639_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1639_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1639_1"><button class="btn btn-outline-danger"><span class="job_id">1639 : Job ID 3ff64f2b3484483e8f5b6f4565ae40dd</span></button></div></a><div aria-labelledby="job_list___sub_heading_1639_1" data-parent="#job_list___sub_accordion_1639" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1639_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=333" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (333, 66), end pos: (333, 68)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -330,7 +330,7 @@ except Exception: raise WatermarkingError("Malformed object hash entry") from None try: - obj_str = doc.xref_object(xref, compressed=False) or "" + obj_str = doc.xref_object(xref, compressed=False) and "" except Exception: raise WatermarkingError( "Referenced object missing (tampered)"</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.98s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1640"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1640_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1640_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1640_1"><button class="btn btn-outline-danger"><span class="job_id">1640 : Job ID 91b498f664b942c58ba1a77c8c9da7bb</span></button></div></a><div aria-labelledby="job_list___sub_heading_1640_1" data-parent="#job_list___sub_accordion_1640" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1640_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=339" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (339, 41), end pos: (339, 43)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 8</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -336,7 +336,7 @@ "Referenced object missing (tampered)" ) from None lower = obj_str.lower() - if "/type /catalog" in lower or "/names" in lower: + if "/type /catalog" in lower and "/names" in lower: continue b = obj_str.encode("latin-1", "replace") actual = self._sha256(b)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.94s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1641"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1641_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1641_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1641_1"><button class="btn btn-outline-danger"><span class="job_id">1641 : Job ID 4b847c0cda94412f85d81dab4e5753d9</span></button></div></a><div aria-labelledby="job_list___sub_heading_1641_1" data-parent="#job_list___sub_accordion_1641" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1641_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=252" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (252, 16), end pos: (252, 21)</button></a></pre><pre>operator: core/ReplaceBreakWithContinue, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -249,7 +249,7 @@ return out for xref in range(1, xref_len): if len(out) &gt;= self._OBJ_SAMPLE_LIMIT: - break + continue try: obj_str = doc.xref_object(xref, compressed=False) or "" except Exception as exc:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.19s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1642"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1642_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1642_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1642_1"><button class="btn btn-outline-danger"><span class="job_id">1642 : Job ID 82bcee2c6301438c9c8e33a4a438aac2</span></button></div></a><div aria-labelledby="job_list___sub_heading_1642_1" data-parent="#job_list___sub_accordion_1642" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1642_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=259" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (259, 16), end pos: (259, 24)</button></a></pre><pre>operator: core/ReplaceContinueWithBreak, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -256,7 +256,7 @@ logging.getLogger(__name__).debug( "Reading xref %s failed: %s", xref, exc ) - continue + break lower = obj_str.lower() if "/type /catalog" in lower or "/names" in lower: continue</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.36s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1643"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1643_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1643_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1643_1"><button class="btn btn-outline-danger"><span class="job_id">1643 : Job ID 651cfa98683d45b5a5f7156168f9762f</span></button></div></a><div aria-labelledby="job_list___sub_heading_1643_1" data-parent="#job_list___sub_accordion_1643" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1643_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=262" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (262, 16), end pos: (262, 24)</button></a></pre><pre>operator: core/ReplaceContinueWithBreak, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -259,7 +259,7 @@ continue lower = obj_str.lower() if "/type /catalog" in lower or "/names" in lower: - continue + break b = obj_str.encode("latin-1", "replace") if len(b.strip()) &lt; 8: continue</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.20s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1644"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1644_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1644_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1644_1"><button class="btn btn-outline-success"><span class="job_id">1644 : Job ID 33e4eb1918264959b252dbd98685f6e0</span></button></div></a><div aria-labelledby="job_list___sub_heading_1644_1" data-parent="#job_list___sub_accordion_1644" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1644_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=265" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (265, 16), end pos: (265, 24)</button></a></pre><pre>operator: core/ReplaceContinueWithBreak, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -262,7 +262,7 @@ continue b = obj_str.encode("latin-1", "replace") if len(b.strip()) &lt; 8: - continue + break sha256 = self._sha256(b) out.append(_ObjectHash(xref=xref, sha256=sha256)) return out</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T184905262039Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T184906343042Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 20.21s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1645"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1645_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1645_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1645_1"><button class="btn btn-outline-danger"><span class="job_id">1645 : Job ID e5697d4f5d4947b89c2fcdf5050f12a1</span></button></div></a><div aria-labelledby="job_list___sub_heading_1645_1" data-parent="#job_list___sub_accordion_1645" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1645_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=340" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (340, 16), end pos: (340, 24)</button></a></pre><pre>operator: core/ReplaceContinueWithBreak, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -337,7 +337,7 @@ ) from None lower = obj_str.lower() if "/type /catalog" in lower or "/names" in lower: - continue + break b = obj_str.encode("latin-1", "replace") actual = self._sha256(b) if actual != expected:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.51s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1646"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1646_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1646_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1646_1"><button class="btn btn-outline-danger"><span class="job_id">1646 : Job ID 4221f0c4e5d842b094b54bb3311aab69</span></button></div></a><div aria-labelledby="job_list___sub_heading_1646_1" data-parent="#job_list___sub_accordion_1646" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1646_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=40" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (40, 7), end pos: (40, 16)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -37,7 +37,7 @@ import pymupdf HAS_PYMUPDF = True -except Exception: +except CosmicRayTestingException: HAS_PYMUPDF = False </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.28s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1647"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1647_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1647_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1647_1"><button class="btn btn-outline-danger"><span class="job_id">1647 : Job ID bfbce674a4e7449e976c4ada52bab1c6</span></button></div></a><div aria-labelledby="job_list___sub_heading_1647_1" data-parent="#job_list___sub_accordion_1647" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1647_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=94" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (94, 15), end pos: (94, 24)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -91,7 +91,7 @@ doc.close() original = load_pdf_bytes(new_doc) doc = pymupdf.open(stream=original, filetype="pdf") - except Exception as exc: # fallback: create new doc and append original as raw? + except CosmicRayTestingException as exc: # fallback: create new doc and append original as raw? raise WatermarkingError(f"Failed to open PDF: {exc}") from exc logger = logging.getLogger(__name__) try:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.21s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1648"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1648_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1648_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1648_1"><button class="btn btn-outline-danger"><span class="job_id">1648 : Job ID e83a16d56603417ea3898ac9240570b9</span></button></div></a><div aria-labelledby="job_list___sub_heading_1648_1" data-parent="#job_list___sub_accordion_1648" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1648_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=137" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (137, 19), end pos: (137, 28)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -134,7 +134,7 @@ and self._EMBED_NAME in doc._embfile_names() ): doc._embfile_del(self._EMBED_NAME) - except Exception as exc: + except CosmicRayTestingException as exc: logger.debug("Cleanup of existing embedded file failed: %s", exc) try: if hasattr(doc, "_embfile_add"):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 22.48s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1649"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1649_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1649_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1649_1"><button class="btn btn-outline-success"><span class="job_id">1649 : Job ID baad2599fa88486db2d63ca2f4feb29f</span></button></div></a><div aria-labelledby="job_list___sub_heading_1649_1" data-parent="#job_list___sub_accordion_1649" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1649_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=147" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (147, 19), end pos: (147, 28)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -144,7 +144,7 @@ filename=self._EMBED_NAME, desc="Tatou signed watermark manifest v1", ) - except Exception as exc: + except CosmicRayTestingException as exc: raise WatermarkingError( f"Failed to attach watermark embedded file: {exc}" ) from exc</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T031621054759Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T031621942058Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ERROR server:rmap_handler.py:245 Failed to add source PDF to database: No users exist to own RMAP base document; create a user first ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 11 failed, 3 passed, 22 warnings in 19.32s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1650"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1650_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1650_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1650_1"><button class="btn btn-outline-danger"><span class="job_id">1650 : Job ID 6fca83131ec74d05a906f1ffd4dceac0</span></button></div></a><div aria-labelledby="job_list___sub_heading_1650_1" data-parent="#job_list___sub_accordion_1650" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1650_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=155" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (155, 19), end pos: (155, 28)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -152,7 +152,7 @@ finally: try: doc.close() - except Exception as exc: + except CosmicRayTestingException as exc: logging.getLogger(__name__).debug("Closing document failed: %s", exc) def is_watermark_applicable(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.69s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1651"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1651_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1651_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1651_1"><button class="btn btn-outline-success"><span class="job_id">1651 : Job ID a814f66bf36946c2ad83c8a61bb2a7f9</span></button></div></a><div aria-labelledby="job_list___sub_heading_1651_1" data-parent="#job_list___sub_accordion_1651" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1651_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=168" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (168, 15), end pos: (168, 24)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -165,7 +165,7 @@ try: b = load_pdf_bytes(pdf) doc = pymupdf.open(stream=b, filetype="pdf") - except Exception: + except CosmicRayTestingException: return False finally: try:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T011416225713Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T011417171367Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.32s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1652"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1652_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1652_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1652_1"><button class="btn btn-outline-success"><span class="job_id">1652 : Job ID c2506ec5b03a4bca913a0641210aff6b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1652_1" data-parent="#job_list___sub_accordion_1652" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1652_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=173" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (173, 19), end pos: (173, 28)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -170,7 +170,7 @@ finally: try: doc.close() - except Exception as exc: + except CosmicRayTestingException as exc: logging.getLogger(__name__).debug("Closing document failed: %s", exc) return True </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T221617370295Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T221618259553Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.60s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1653"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1653_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1653_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1653_1"><button class="btn btn-outline-danger"><span class="job_id">1653 : Job ID 8f7f245b6dcf4f1caf21e336b50e2c36</span></button></div></a><div aria-labelledby="job_list___sub_heading_1653_1" data-parent="#job_list___sub_accordion_1653" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1653_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=192" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (192, 19), end pos: (192, 28)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -189,7 +189,7 @@ try: manifest = json.loads(manifest_bytes.decode("utf-8")) - except Exception as exc: + except CosmicRayTestingException as exc: raise SecretNotFoundError("Malformed watermark manifest") from exc salt = base64.b64decode(manifest["salt"])</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.18s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1654"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1654_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1654_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1654_1"><button class="btn btn-outline-success"><span class="job_id">1654 : Job ID a82181dd5279497bb06126a7a24d363b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1654_1" data-parent="#job_list___sub_accordion_1654" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1654_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=208" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (208, 19), end pos: (208, 28)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 8</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -205,7 +205,7 @@ aes = AESGCM(key_bytes) try: pt = aes.decrypt(nonce, ct, None) - except Exception as exc: + except CosmicRayTestingException as exc: raise InvalidKeyError( "Failed to authenticate watermark (key?)" ) from exc</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e267fd059431e9f6f: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.69s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1655"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1655_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1655_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1655_1"><button class="btn btn-outline-success"><span class="job_id">1655 : Job ID 48b1116acfdd4a9e8924a1a069b5c4e2</span></button></div></a><div aria-labelledby="job_list___sub_heading_1655_1" data-parent="#job_list___sub_accordion_1655" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1655_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=215" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (215, 19), end pos: (215, 28)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 9</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -212,7 +212,7 @@ try: payload = json.loads(pt.decode("utf-8")) - except Exception as exc: + except CosmicRayTestingException as exc: raise SecretNotFoundError("Corrupted decrypted payload") from exc # Validate structure</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....F...F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ec19d59134ae98a29: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 3 failed, 11 passed, 22 warnings in 20.98s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1656"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1656_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1656_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1656_1"><button class="btn btn-outline-success"><span class="job_id">1656 : Job ID 15dc6cc44bee419aba5f71fffc16cf91</span></button></div></a><div aria-labelledby="job_list___sub_heading_1656_1" data-parent="#job_list___sub_accordion_1656" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1656_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=248" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (248, 15), end pos: (248, 24)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 10</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -245,7 +245,7 @@ out: list[_ObjectHash] = [] try: xref_len = doc.xref_length() - except Exception: + except CosmicRayTestingException: return out for xref in range(1, xref_len): if len(out) &gt;= self._OBJ_SAMPLE_LIMIT:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T211035906904Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T211036968791Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 20.59s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1657"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1657_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1657_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1657_1"><button class="btn btn-outline-danger"><span class="job_id">1657 : Job ID 45082277ff2f4e9dbcd39e9f61f6ff81</span></button></div></a><div aria-labelledby="job_list___sub_heading_1657_1" data-parent="#job_list___sub_accordion_1657" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1657_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=255" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (255, 19), end pos: (255, 28)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 11</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -252,7 +252,7 @@ break try: obj_str = doc.xref_object(xref, compressed=False) or "" - except Exception as exc: + except CosmicRayTestingException as exc: logging.getLogger(__name__).debug( "Reading xref %s failed: %s", xref, exc )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.70s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1658"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1658_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1658_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1658_1"><button class="btn btn-outline-danger"><span class="job_id">1658 : Job ID 7455955ce5a44c7b8c4effccd6db8c44</span></button></div></a><div aria-labelledby="job_list___sub_heading_1658_1" data-parent="#job_list___sub_accordion_1658" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1658_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=284" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (284, 19), end pos: (284, 28)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 12</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -281,7 +281,7 @@ # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64) flags = 1 | 2 | 32 | 64 annot.set_flags(flags) - except Exception as exc: + except CosmicRayTestingException as exc: logger.debug("Setting annotation flags failed: %s", exc) try: # Ensure it is not auto-open</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.41s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1659"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1659_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1659_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1659_1"><button class="btn btn-outline-danger"><span class="job_id">1659 : Job ID e26a6554ad284919bc6e636a47a06d21</span></button></div></a><div aria-labelledby="job_list___sub_heading_1659_1" data-parent="#job_list___sub_accordion_1659" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1659_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=290" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (290, 19), end pos: (290, 28)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 13</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -287,7 +287,7 @@ # Ensure it is not auto-open if hasattr(annot, "set_open"): annot.set_open(False) - except Exception as exc: + except CosmicRayTestingException as exc: logger.debug("Setting annotation open state failed: %s", exc) try: annot.set_opacity(0)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.96s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1660"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1660_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1660_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1660_1"><button class="btn btn-outline-danger"><span class="job_id">1660 : Job ID 43f3630f26604d5d83d958f020fdd503</span></button></div></a><div aria-labelledby="job_list___sub_heading_1660_1" data-parent="#job_list___sub_accordion_1660" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1660_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=294" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (294, 19), end pos: (294, 28)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 14</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -291,7 +291,7 @@ logger.debug("Setting annotation open state failed: %s", exc) try: annot.set_opacity(0) - except Exception as exc: + except CosmicRayTestingException as exc: logger.debug("Setting annotation opacity failed: %s", exc) try: # Shrink rectangle to a tiny box</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.18s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1661"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1661_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1661_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1661_1"><button class="btn btn-outline-danger"><span class="job_id">1661 : Job ID ba5c993332734205aa6288f2a6738e2e</span></button></div></a><div aria-labelledby="job_list___sub_heading_1661_1" data-parent="#job_list___sub_accordion_1661" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1661_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=301" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (301, 19), end pos: (301, 28)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 15</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -298,7 +298,7 @@ r = annot.rect tiny = pymupdf.Rect(r.x0, r.y1 - 2, r.x0 + 2, r.y1) annot.set_rect(tiny) - except Exception as exc: + except CosmicRayTestingException as exc: logger.debug("Shrinking annotation rect failed: %s", exc) try: annot.update()</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.62s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1662"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1662_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1662_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1662_1"><button class="btn btn-outline-success"><span class="job_id">1662 : Job ID abb0348ddfa045bb80a633d245e01eda</span></button></div></a><div aria-labelledby="job_list___sub_heading_1662_1" data-parent="#job_list___sub_accordion_1662" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1662_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=305" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (305, 19), end pos: (305, 28)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 16</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -302,7 +302,7 @@ logger.debug("Shrinking annotation rect failed: %s", exc) try: annot.update() - except Exception as exc: + except CosmicRayTestingException as exc: logger.debug("Annotation update failed: %s", exc) except Exception as exc: logger.debug("Adding invisible annotation failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T013326544083Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T013327498700Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.54s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1663"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1663_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1663_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1663_1"><button class="btn btn-outline-success"><span class="job_id">1663 : Job ID 7a9785cbad2c45ceae481d35be9c19ba</span></button></div></a><div aria-labelledby="job_list___sub_heading_1663_1" data-parent="#job_list___sub_accordion_1663" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1663_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=307" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (307, 15), end pos: (307, 24)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 17</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -304,7 +304,7 @@ annot.update() except Exception as exc: logger.debug("Annotation update failed: %s", exc) - except Exception as exc: + except CosmicRayTestingException as exc: logger.debug("Adding invisible annotation failed: %s", exc) return None </pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T055427489655Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T055428346059Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.67s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1664"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1664_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1664_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1664_1"><button class="btn btn-outline-success"><span class="job_id">1664 : Job ID 957da49738704566b98fe3e49bf9f1ea</span></button></div></a><div aria-labelledby="job_list___sub_heading_1664_1" data-parent="#job_list___sub_accordion_1664" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1664_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=321" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (321, 15), end pos: (321, 24)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 18</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -318,7 +318,7 @@ file_bytes = doc.embfile_get(self._EMBED_NAME) if isinstance(file_bytes, bytes | bytearray): return bytes(file_bytes) - except Exception as exc: + except CosmicRayTestingException as exc: logger.debug("Failed to extract embedded manifest: %s", exc) return None </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T033603474219Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T033604472136Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.79s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1665"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1665_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1665_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1665_1"><button class="btn btn-outline-danger"><span class="job_id">1665 : Job ID 28cd541520cb41a390da274b3072d6ca</span></button></div></a><div aria-labelledby="job_list___sub_heading_1665_1" data-parent="#job_list___sub_accordion_1665" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1665_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=330" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (330, 19), end pos: (330, 28)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 19</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -327,7 +327,7 @@ try: xref = int(e.get("xref")) expected = str(e.get("sha256")) - except Exception: + except CosmicRayTestingException: raise WatermarkingError("Malformed object hash entry") from None try: obj_str = doc.xref_object(xref, compressed=False) or ""</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.16s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1666"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1666_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1666_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1666_1"><button class="btn btn-outline-success"><span class="job_id">1666 : Job ID b9e9894944514c7f8c4371c5e25364ba</span></button></div></a><div aria-labelledby="job_list___sub_heading_1666_1" data-parent="#job_list___sub_accordion_1666" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1666_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=334" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (334, 19), end pos: (334, 28)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 20</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -331,7 +331,7 @@ raise WatermarkingError("Malformed object hash entry") from None try: obj_str = doc.xref_object(xref, compressed=False) or "" - except Exception: + except CosmicRayTestingException: raise WatermarkingError( "Referenced object missing (tampered)" ) from None</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T171441631592Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T171442506644Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.26s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1667"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1667_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1667_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1667_1"><button class="btn btn-outline-danger"><span class="job_id">1667 : Job ID d6544f7a543e46b181f0b86c670d6480</span></button></div></a><div aria-labelledby="job_list___sub_heading_1667_1" data-parent="#job_list___sub_accordion_1667" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1667_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=57" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (57, 27), end pos: (57, 28)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -54,7 +54,7 @@ # Constants _EMBED_NAME: Final[str] = "WM-TATOU-SIGNED-v1.json" - _VERSION: Final[int] = 1 + _VERSION: Final[int] = 2 _PBKDF2_ITER: Final[int] = 120_000 _SALT_LEN: Final[int] = 16 _OBJ_SAMPLE_LIMIT: Final[int] = 12</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.61s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1668"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1668_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1668_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1668_1"><button class="btn btn-outline-danger"><span class="job_id">1668 : Job ID d0980a3c6a594553bf1704c1297de48a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1668_1" data-parent="#job_list___sub_accordion_1668" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1668_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=57" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (57, 27), end pos: (57, 28)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -54,7 +54,7 @@ # Constants _EMBED_NAME: Final[str] = "WM-TATOU-SIGNED-v1.json" - _VERSION: Final[int] = 1 + _VERSION: Final[int] = 0 _PBKDF2_ITER: Final[int] = 120_000 _SALT_LEN: Final[int] = 16 _OBJ_SAMPLE_LIMIT: Final[int] = 12</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.80s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1669"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1669_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1669_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1669_1"><button class="btn btn-outline-danger"><span class="job_id">1669 : Job ID 56a98f4911324bf08c1202e1ba268bf2</span></button></div></a><div aria-labelledby="job_list___sub_heading_1669_1" data-parent="#job_list___sub_accordion_1669" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1669_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=58" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (58, 31), end pos: (58, 38)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -55,7 +55,7 @@ # Constants _EMBED_NAME: Final[str] = "WM-TATOU-SIGNED-v1.json" _VERSION: Final[int] = 1 - _PBKDF2_ITER: Final[int] = 120_000 + _PBKDF2_ITER: Final[int] = 120001 _SALT_LEN: Final[int] = 16 _OBJ_SAMPLE_LIMIT: Final[int] = 12 </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.45s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1670"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1670_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1670_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1670_1"><button class="btn btn-outline-danger"><span class="job_id">1670 : Job ID 8d86ce6cf05a40e49bf66e80a244ad0e</span></button></div></a><div aria-labelledby="job_list___sub_heading_1670_1" data-parent="#job_list___sub_accordion_1670" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1670_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=58" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (58, 31), end pos: (58, 38)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -55,7 +55,7 @@ # Constants _EMBED_NAME: Final[str] = "WM-TATOU-SIGNED-v1.json" _VERSION: Final[int] = 1 - _PBKDF2_ITER: Final[int] = 120_000 + _PBKDF2_ITER: Final[int] = 119999 _SALT_LEN: Final[int] = 16 _OBJ_SAMPLE_LIMIT: Final[int] = 12 </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.96s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1671"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1671_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1671_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1671_1"><button class="btn btn-outline-danger"><span class="job_id">1671 : Job ID 909e7b0f61734bc2993b8f92d016b82a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1671_1" data-parent="#job_list___sub_accordion_1671" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1671_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=59" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (59, 28), end pos: (59, 30)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -56,7 +56,7 @@ _EMBED_NAME: Final[str] = "WM-TATOU-SIGNED-v1.json" _VERSION: Final[int] = 1 _PBKDF2_ITER: Final[int] = 120_000 - _SALT_LEN: Final[int] = 16 + _SALT_LEN: Final[int] = 17 _OBJ_SAMPLE_LIMIT: Final[int] = 12 @staticmethod</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.07s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1672"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1672_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1672_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1672_1"><button class="btn btn-outline-success"><span class="job_id">1672 : Job ID 008a0926d2ee40eca32ee950ff644b94</span></button></div></a><div aria-labelledby="job_list___sub_heading_1672_1" data-parent="#job_list___sub_accordion_1672" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1672_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=59" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (59, 28), end pos: (59, 30)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -56,7 +56,7 @@ _EMBED_NAME: Final[str] = "WM-TATOU-SIGNED-v1.json" _VERSION: Final[int] = 1 _PBKDF2_ITER: Final[int] = 120_000 - _SALT_LEN: Final[int] = 16 + _SALT_LEN: Final[int] = 15 _OBJ_SAMPLE_LIMIT: Final[int] = 12 @staticmethod</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T162854440262Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T162855301698Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.15s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1673"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1673_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1673_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1673_1"><button class="btn btn-outline-danger"><span class="job_id">1673 : Job ID 88fba1f6fe904ab9b3450c0095e39ca4</span></button></div></a><div aria-labelledby="job_list___sub_heading_1673_1" data-parent="#job_list___sub_accordion_1673" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1673_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=60" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (60, 36), end pos: (60, 38)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -57,7 +57,7 @@ _VERSION: Final[int] = 1 _PBKDF2_ITER: Final[int] = 120_000 _SALT_LEN: Final[int] = 16 - _OBJ_SAMPLE_LIMIT: Final[int] = 12 + _OBJ_SAMPLE_LIMIT: Final[int] = 13 @staticmethod def get_usage() -&gt; str:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.14s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1674"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1674_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1674_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1674_1"><button class="btn btn-outline-danger"><span class="job_id">1674 : Job ID 495572ad27bf49f9a173b745fb991a2b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1674_1" data-parent="#job_list___sub_accordion_1674" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1674_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=60" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (60, 36), end pos: (60, 38)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -57,7 +57,7 @@ _VERSION: Final[int] = 1 _PBKDF2_ITER: Final[int] = 120_000 _SALT_LEN: Final[int] = 16 - _OBJ_SAMPLE_LIMIT: Final[int] = 12 + _OBJ_SAMPLE_LIMIT: Final[int] = 11 @staticmethod def get_usage() -&gt; str:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.11s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1675"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1675_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1675_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1675_1"><button class="btn btn-outline-danger"><span class="job_id">1675 : Job ID f1af41c8a7354846a30e09f787b6f0c7</span></button></div></a><div aria-labelledby="job_list___sub_heading_1675_1" data-parent="#job_list___sub_accordion_1675" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1675_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=99" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (99, 33), end pos: (99, 34)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 8</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -96,7 +96,7 @@ logger = logging.getLogger(__name__) try: # Some minimal test PDFs may have no page tree; enforce at least one page. - if doc.page_count == 0: + if doc.page_count == 1: # Create a brand new document with a blank page instead logger.debug("Rebuilding minimal PDF to include a page") doc.close()</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.42s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1676"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1676_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1676_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1676_1"><button class="btn btn-outline-success"><span class="job_id">1676 : Job ID 3457ab8c4a9b4cbd9da44a34a0471bd5</span></button></div></a><div aria-labelledby="job_list___sub_heading_1676_1" data-parent="#job_list___sub_accordion_1676" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1676_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=99" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (99, 33), end pos: (99, 34)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 9</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -96,7 +96,7 @@ logger = logging.getLogger(__name__) try: # Some minimal test PDFs may have no page tree; enforce at least one page. - if doc.page_count == 0: + if doc.page_count == -1: # Create a brand new document with a blank page instead logger.debug("Rebuilding minimal PDF to include a page") doc.close()</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%]</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1677"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1677_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1677_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1677_1"><button class="btn btn-outline-success"><span class="job_id">1677 : Job ID 6b2fce0da73d43f693981dd82331d152</span></button></div></a><div aria-labelledby="job_list___sub_heading_1677_1" data-parent="#job_list___sub_accordion_1677" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1677_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=106" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (106, 36), end pos: (106, 37)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 10</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -103,7 +103,7 @@ doc = pymupdf.open() doc.new_page() watermark_id = str(uuid.uuid4()) - id_hint = watermark_id[:8] + id_hint = watermark_id[: 9] self._add_invisible_annotation(doc, f"WM:{id_hint}") obj_hashes = self._select_and_hash_objects(doc) salt = secrets.token_bytes(self._SALT_LEN)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T180621264388Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T180622223206Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 20.23s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1678"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1678_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1678_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1678_1"><button class="btn btn-outline-success"><span class="job_id">1678 : Job ID c48195297f37446db02d006ec326a81b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1678_1" data-parent="#job_list___sub_accordion_1678" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1678_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=106" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (106, 36), end pos: (106, 37)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 11</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -103,7 +103,7 @@ doc = pymupdf.open() doc.new_page() watermark_id = str(uuid.uuid4()) - id_hint = watermark_id[:8] + id_hint = watermark_id[: 7] self._add_invisible_annotation(doc, f"WM:{id_hint}") obj_hashes = self._select_and_hash_objects(doc) salt = secrets.token_bytes(self._SALT_LEN)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T042418720791Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T042419670647Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.72s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1679"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1679_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1679_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1679_1"><button class="btn btn-outline-success"><span class="job_id">1679 : Job ID 6be3de5d70c04c6ca988518679613d64</span></button></div></a><div aria-labelledby="job_list___sub_heading_1679_1" data-parent="#job_list___sub_accordion_1679" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1679_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=110" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (110, 40), end pos: (110, 42)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 12</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -107,7 +107,7 @@ self._add_invisible_annotation(doc, f"WM:{id_hint}") obj_hashes = self._select_and_hash_objects(doc) salt = secrets.token_bytes(self._SALT_LEN) - nonce = secrets.token_bytes(12) + nonce = secrets.token_bytes( 13) derived_key = self._derive_key(key, salt) plaintext = { "v": self._VERSION,</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614eccc74c58e2924576: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.97s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1680"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1680_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1680_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1680_1"><button class="btn btn-outline-success"><span class="job_id">1680 : Job ID 320f4615e206490ebd0d919d54705b1d</span></button></div></a><div aria-labelledby="job_list___sub_heading_1680_1" data-parent="#job_list___sub_accordion_1680" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1680_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=110" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (110, 40), end pos: (110, 42)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 13</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -107,7 +107,7 @@ self._add_invisible_annotation(doc, f"WM:{id_hint}") obj_hashes = self._select_and_hash_objects(doc) salt = secrets.token_bytes(self._SALT_LEN) - nonce = secrets.token_bytes(12) + nonce = secrets.token_bytes( 11) derived_key = self._derive_key(key, salt) plaintext = { "v": self._VERSION,</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T170857961432Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T170858906082Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.21s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1681"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1681_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1681_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1681_1"><button class="btn btn-outline-danger"><span class="job_id">1681 : Job ID 0c0631816b494ff2b185bf92bfcc44c3</span></button></div></a><div aria-labelledby="job_list___sub_heading_1681_1" data-parent="#job_list___sub_accordion_1681" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1681_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=201" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (201, 29), end pos: (201, 30)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 14</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -198,7 +198,7 @@ iter_count = int(manifest.get("iter", self._PBKDF2_ITER)) # Limit to 300k iterations to prevent DoS attacks # triggered by excessive PBKDF2 computation - if iter_count &lt;= 0 or iter_count &gt; 300_000: + if iter_count &lt;= 1 or iter_count &gt; 300_000: raise WatermarkingError("Unreasonable PBKDF2 iteration count") key_bytes = self._derive_key(key, salt, iter_override=iter_count)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 22.10s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1682"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1682_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1682_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1682_1"><button class="btn btn-outline-danger"><span class="job_id">1682 : Job ID a6c0a7e9bdcd4f5b846a645b1a62c67a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1682_1" data-parent="#job_list___sub_accordion_1682" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1682_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=201" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (201, 29), end pos: (201, 30)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 15</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -198,7 +198,7 @@ iter_count = int(manifest.get("iter", self._PBKDF2_ITER)) # Limit to 300k iterations to prevent DoS attacks # triggered by excessive PBKDF2 computation - if iter_count &lt;= 0 or iter_count &gt; 300_000: + if iter_count &lt;= -1 or iter_count &gt; 300_000: raise WatermarkingError("Unreasonable PBKDF2 iteration count") key_bytes = self._derive_key(key, salt, iter_override=iter_count)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.22s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1683"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1683_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1683_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1683_1"><button class="btn btn-outline-success"><span class="job_id">1683 : Job ID 1d7c08fa1ae04b8e840d43efc01da5b2</span></button></div></a><div aria-labelledby="job_list___sub_heading_1683_1" data-parent="#job_list___sub_accordion_1683" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1683_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=201" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (201, 47), end pos: (201, 54)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 16</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -198,7 +198,7 @@ iter_count = int(manifest.get("iter", self._PBKDF2_ITER)) # Limit to 300k iterations to prevent DoS attacks # triggered by excessive PBKDF2 computation - if iter_count &lt;= 0 or iter_count &gt; 300_000: + if iter_count &lt;= 0 or iter_count &gt; 300001: raise WatermarkingError("Unreasonable PBKDF2 iteration count") key_bytes = self._derive_key(key, salt, iter_override=iter_count)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T021507712120Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T021508581923Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.19s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1684"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1684_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1684_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1684_1"><button class="btn btn-outline-danger"><span class="job_id">1684 : Job ID 2ff177954f124cb8a8c7ea3b4b54c9bb</span></button></div></a><div aria-labelledby="job_list___sub_heading_1684_1" data-parent="#job_list___sub_accordion_1684" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1684_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=201" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (201, 47), end pos: (201, 54)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 17</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -198,7 +198,7 @@ iter_count = int(manifest.get("iter", self._PBKDF2_ITER)) # Limit to 300k iterations to prevent DoS attacks # triggered by excessive PBKDF2 computation - if iter_count &lt;= 0 or iter_count &gt; 300_000: + if iter_count &lt;= 0 or iter_count &gt; 299999: raise WatermarkingError("Unreasonable PBKDF2 iteration count") key_bytes = self._derive_key(key, salt, iter_override=iter_count)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.39s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1685"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1685_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1685_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1685_1"><button class="btn btn-outline-success"><span class="job_id">1685 : Job ID 721433f935d443a28624d6d55a2eb25c</span></button></div></a><div aria-labelledby="job_list___sub_heading_1685_1" data-parent="#job_list___sub_accordion_1685" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1685_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=237" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (237, 19), end pos: (237, 21)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 18</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -234,7 +234,7 @@ ) -&gt; bytes: kdf = PBKDF2HMAC( algorithm=hashes.SHA256(), - length=32, + length= 33, salt=salt, iterations=iter_override or self._PBKDF2_ITER, )</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%]</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1686"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1686_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1686_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1686_1"><button class="btn btn-outline-danger"><span class="job_id">1686 : Job ID 7ad0d8ca2be74ee98e1275694dca3e2c</span></button></div></a><div aria-labelledby="job_list___sub_heading_1686_1" data-parent="#job_list___sub_accordion_1686" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1686_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=237" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (237, 19), end pos: (237, 21)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 19</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -234,7 +234,7 @@ ) -&gt; bytes: kdf = PBKDF2HMAC( algorithm=hashes.SHA256(), - length=32, + length= 31, salt=salt, iterations=iter_override or self._PBKDF2_ITER, )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.05s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1687"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1687_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1687_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1687_1"><button class="btn btn-outline-danger"><span class="job_id">1687 : Job ID 95b6e2265409470e8031502285c8ca8f</span></button></div></a><div aria-labelledby="job_list___sub_heading_1687_1" data-parent="#job_list___sub_accordion_1687" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1687_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=250" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (250, 26), end pos: (250, 27)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 20</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -247,7 +247,7 @@ xref_len = doc.xref_length() except Exception: return out - for xref in range(1, xref_len): + for xref in range( 2, xref_len): if len(out) &gt;= self._OBJ_SAMPLE_LIMIT: break try:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.13s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1688"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1688_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1688_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1688_1"><button class="btn btn-outline-danger"><span class="job_id">1688 : Job ID 8ef4645d3f714acf931f73ebee256b1d</span></button></div></a><div aria-labelledby="job_list___sub_heading_1688_1" data-parent="#job_list___sub_accordion_1688" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1688_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=250" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (250, 26), end pos: (250, 27)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 21</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -247,7 +247,7 @@ xref_len = doc.xref_length() except Exception: return out - for xref in range(1, xref_len): + for xref in range( 0, xref_len): if len(out) &gt;= self._OBJ_SAMPLE_LIMIT: break try:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.28s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1689"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1689_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1689_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1689_1"><button class="btn btn-outline-danger"><span class="job_id">1689 : Job ID c7f0fca914ae4ef2bf8e80a50cff51f5</span></button></div></a><div aria-labelledby="job_list___sub_heading_1689_1" data-parent="#job_list___sub_accordion_1689" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1689_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=264" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (264, 32), end pos: (264, 33)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 22</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -261,7 +261,7 @@ if "/type /catalog" in lower or "/names" in lower: continue b = obj_str.encode("latin-1", "replace") - if len(b.strip()) &lt; 8: + if len(b.strip()) &lt; 9: continue sha256 = self._sha256(b) out.append(_ObjectHash(xref=xref, sha256=sha256))</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.38s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1690"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1690_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1690_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1690_1"><button class="btn btn-outline-danger"><span class="job_id">1690 : Job ID 6a9264eaf8b448c8a38672f5da12276b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1690_1" data-parent="#job_list___sub_accordion_1690" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1690_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=264" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (264, 32), end pos: (264, 33)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 23</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -261,7 +261,7 @@ if "/type /catalog" in lower or "/names" in lower: continue b = obj_str.encode("latin-1", "replace") - if len(b.strip()) &lt; 8: + if len(b.strip()) &lt; 7: continue sha256 = self._sha256(b) out.append(_ObjectHash(xref=xref, sha256=sha256))</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.04s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1691"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1691_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1691_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1691_1"><button class="btn btn-outline-success"><span class="job_id">1691 : Job ID 05563b8c1ce64c25a3fc25de855f768b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1691_1" data-parent="#job_list___sub_accordion_1691" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1691_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=273" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (273, 33), end pos: (273, 34)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 24</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -270,7 +270,7 @@ def _add_invisible_annotation(self, doc: pymupdf.Document, text: str) -&gt; None: logger = logging.getLogger(__name__) try: - if doc.page_count == 0: + if doc.page_count == 1: doc.new_page() page = doc.load_page(0) # Place near top-left (PDF origin is bottom-left)</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ee04917f1154ce0a2: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.76s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1692"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1692_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1692_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1692_1"><button class="btn btn-outline-danger"><span class="job_id">1692 : Job ID febe0f534707429a8ecc32a23745002f</span></button></div></a><div aria-labelledby="job_list___sub_heading_1692_1" data-parent="#job_list___sub_accordion_1692" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1692_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=273" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (273, 33), end pos: (273, 34)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 25</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -270,7 +270,7 @@ def _add_invisible_annotation(self, doc: pymupdf.Document, text: str) -&gt; None: logger = logging.getLogger(__name__) try: - if doc.page_count == 0: + if doc.page_count == -1: doc.new_page() page = doc.load_page(0) # Place near top-left (PDF origin is bottom-left)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.34s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1693"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1693_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1693_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1693_1"><button class="btn btn-outline-danger"><span class="job_id">1693 : Job ID 0943a07c727c45c2990513b1087b48c9</span></button></div></a><div aria-labelledby="job_list___sub_heading_1693_1" data-parent="#job_list___sub_accordion_1693" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1693_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=275" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (275, 33), end pos: (275, 34)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 26</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -272,7 +272,7 @@ try: if doc.page_count == 0: doc.new_page() - page = doc.load_page(0) + page = doc.load_page( 1) # Place near top-left (PDF origin is bottom-left) margin = 2 tl_point = (margin, page.rect.height - margin)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.13s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1694"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1694_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1694_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1694_1"><button class="btn btn-outline-danger"><span class="job_id">1694 : Job ID 81b58598cb784c51aa4ad1ef89bbf9a3</span></button></div></a><div aria-labelledby="job_list___sub_heading_1694_1" data-parent="#job_list___sub_accordion_1694" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1694_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=275" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (275, 33), end pos: (275, 34)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 27</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -272,7 +272,7 @@ try: if doc.page_count == 0: doc.new_page() - page = doc.load_page(0) + page = doc.load_page( -1) # Place near top-left (PDF origin is bottom-left) margin = 2 tl_point = (margin, page.rect.height - margin)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.32s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1695"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1695_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1695_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1695_1"><button class="btn btn-outline-danger"><span class="job_id">1695 : Job ID 0573e0df02f54e27b3f95f3b89ea7792</span></button></div></a><div aria-labelledby="job_list___sub_heading_1695_1" data-parent="#job_list___sub_accordion_1695" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1695_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=277" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (277, 21), end pos: (277, 22)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 28</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -274,7 +274,7 @@ doc.new_page() page = doc.load_page(0) # Place near top-left (PDF origin is bottom-left) - margin = 2 + margin = 3 tl_point = (margin, page.rect.height - margin) annot = page.add_text_annot(tl_point, text) try:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.23s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1696"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1696_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1696_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1696_1"><button class="btn btn-outline-danger"><span class="job_id">1696 : Job ID bb6f4535715d4e8b9d4e1d4838136766</span></button></div></a><div aria-labelledby="job_list___sub_heading_1696_1" data-parent="#job_list___sub_accordion_1696" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1696_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=277" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (277, 21), end pos: (277, 22)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 29</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -274,7 +274,7 @@ doc.new_page() page = doc.load_page(0) # Place near top-left (PDF origin is bottom-left) - margin = 2 + margin = 1 tl_point = (margin, page.rect.height - margin) annot = page.add_text_annot(tl_point, text) try:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.28s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1697"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1697_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1697_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1697_1"><button class="btn btn-outline-danger"><span class="job_id">1697 : Job ID 8949108eff634da18ec9e7e87d26c8cc</span></button></div></a><div aria-labelledby="job_list___sub_heading_1697_1" data-parent="#job_list___sub_accordion_1697" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1697_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=282" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (282, 24), end pos: (282, 25)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 30</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -279,7 +279,7 @@ annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64) - flags = 1 | 2 | 32 | 64 + flags = 2 | 2 | 32 | 64 annot.set_flags(flags) except Exception as exc: logger.debug("Setting annotation flags failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.25s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1698"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1698_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1698_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1698_1"><button class="btn btn-outline-danger"><span class="job_id">1698 : Job ID caeea60c8ee74997b7ec62ece90c29dd</span></button></div></a><div aria-labelledby="job_list___sub_heading_1698_1" data-parent="#job_list___sub_accordion_1698" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1698_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=282" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (282, 24), end pos: (282, 25)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 31</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -279,7 +279,7 @@ annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64) - flags = 1 | 2 | 32 | 64 + flags = 0 | 2 | 32 | 64 annot.set_flags(flags) except Exception as exc: logger.debug("Setting annotation flags failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.29s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1699"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1699_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1699_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1699_1"><button class="btn btn-outline-danger"><span class="job_id">1699 : Job ID 06bc653481114f9eab3bf73c2bdd81c6</span></button></div></a><div aria-labelledby="job_list___sub_heading_1699_1" data-parent="#job_list___sub_accordion_1699" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1699_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=282" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (282, 28), end pos: (282, 29)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 32</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -279,7 +279,7 @@ annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64) - flags = 1 | 2 | 32 | 64 + flags = 1 | 3 | 32 | 64 annot.set_flags(flags) except Exception as exc: logger.debug("Setting annotation flags failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.45s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1700"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1700_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1700_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1700_1"><button class="btn btn-outline-danger"><span class="job_id">1700 : Job ID 80d1985e539249f89b377828ba780181</span></button></div></a><div aria-labelledby="job_list___sub_heading_1700_1" data-parent="#job_list___sub_accordion_1700" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1700_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=282" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (282, 28), end pos: (282, 29)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 33</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -279,7 +279,7 @@ annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64) - flags = 1 | 2 | 32 | 64 + flags = 1 | 1 | 32 | 64 annot.set_flags(flags) except Exception as exc: logger.debug("Setting annotation flags failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.69s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1701"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1701_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1701_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1701_1"><button class="btn btn-outline-danger"><span class="job_id">1701 : Job ID 105007e63b4e445e9d2b87fa9219da7c</span></button></div></a><div aria-labelledby="job_list___sub_heading_1701_1" data-parent="#job_list___sub_accordion_1701" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1701_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=282" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (282, 32), end pos: (282, 34)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 34</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -279,7 +279,7 @@ annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64) - flags = 1 | 2 | 32 | 64 + flags = 1 | 2 | 33 | 64 annot.set_flags(flags) except Exception as exc: logger.debug("Setting annotation flags failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.24s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1702"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1702_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1702_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1702_1"><button class="btn btn-outline-success"><span class="job_id">1702 : Job ID 211b85eec3cf42a9a3a30e930306af2c</span></button></div></a><div aria-labelledby="job_list___sub_heading_1702_1" data-parent="#job_list___sub_accordion_1702" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1702_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=282" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (282, 32), end pos: (282, 34)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 35</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -279,7 +279,7 @@ annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64) - flags = 1 | 2 | 32 | 64 + flags = 1 | 2 | 31 | 64 annot.set_flags(flags) except Exception as exc: logger.debug("Setting annotation flags failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e7e7d5598ce55a478: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.70s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1703"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1703_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1703_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1703_1"><button class="btn btn-outline-danger"><span class="job_id">1703 : Job ID ba1f5e23e5e84360955c4faa21988d56</span></button></div></a><div aria-labelledby="job_list___sub_heading_1703_1" data-parent="#job_list___sub_accordion_1703" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1703_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=282" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (282, 37), end pos: (282, 39)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 36</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -279,7 +279,7 @@ annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64) - flags = 1 | 2 | 32 | 64 + flags = 1 | 2 | 32 | 65 annot.set_flags(flags) except Exception as exc: logger.debug("Setting annotation flags failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.08s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1704"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1704_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1704_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1704_1"><button class="btn btn-outline-success"><span class="job_id">1704 : Job ID 8634928e6a9545e8a0ac8ffa2b5d8eaa</span></button></div></a><div aria-labelledby="job_list___sub_heading_1704_1" data-parent="#job_list___sub_accordion_1704" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1704_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=282" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (282, 37), end pos: (282, 39)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 37</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -279,7 +279,7 @@ annot = page.add_text_annot(tl_point, text) try: # Flags: Invisible(1) | Hidden(2) | NoView(32) | ReadOnly(64) - flags = 1 | 2 | 32 | 64 + flags = 1 | 2 | 32 | 63 annot.set_flags(flags) except Exception as exc: logger.debug("Setting annotation flags failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T010602293471Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T010603214745Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.50s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1705"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1705_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1705_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1705_1"><button class="btn btn-outline-danger"><span class="job_id">1705 : Job ID af051433980240409ef66adbc1a20d32</span></button></div></a><div aria-labelledby="job_list___sub_heading_1705_1" data-parent="#job_list___sub_accordion_1705" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1705_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=293" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (293, 34), end pos: (293, 35)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 38</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -290,7 +290,7 @@ except Exception as exc: logger.debug("Setting annotation open state failed: %s", exc) try: - annot.set_opacity(0) + annot.set_opacity( 1) except Exception as exc: logger.debug("Setting annotation opacity failed: %s", exc) try:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.15s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1706"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1706_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1706_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1706_1"><button class="btn btn-outline-success"><span class="job_id">1706 : Job ID 15c64320008b45468d82e1fb7d2fcdab</span></button></div></a><div aria-labelledby="job_list___sub_heading_1706_1" data-parent="#job_list___sub_accordion_1706" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1706_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=293" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (293, 34), end pos: (293, 35)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 39</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -290,7 +290,7 @@ except Exception as exc: logger.debug("Setting annotation open state failed: %s", exc) try: - annot.set_opacity(0) + annot.set_opacity( -1) except Exception as exc: logger.debug("Setting annotation opacity failed: %s", exc) try:</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ebdca024f0996c00f: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.67s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1707"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1707_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1707_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1707_1"><button class="btn btn-outline-danger"><span class="job_id">1707 : Job ID b0470521045548a981a0569a6118f3a5</span></button></div></a><div aria-labelledby="job_list___sub_heading_1707_1" data-parent="#job_list___sub_accordion_1707" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1707_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=299" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (299, 49), end pos: (299, 50)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 40</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -296,7 +296,7 @@ try: # Shrink rectangle to a tiny box r = annot.rect - tiny = pymupdf.Rect(r.x0, r.y1 - 2, r.x0 + 2, r.y1) + tiny = pymupdf.Rect(r.x0, r.y1 - 3, r.x0 + 2, r.y1) annot.set_rect(tiny) except Exception as exc: logger.debug("Shrinking annotation rect failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.18s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1708"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1708_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1708_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1708_1"><button class="btn btn-outline-success"><span class="job_id">1708 : Job ID 141b8d43226b48e8948cca8481c32c98</span></button></div></a><div aria-labelledby="job_list___sub_heading_1708_1" data-parent="#job_list___sub_accordion_1708" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1708_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=299" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (299, 49), end pos: (299, 50)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 41</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -296,7 +296,7 @@ try: # Shrink rectangle to a tiny box r = annot.rect - tiny = pymupdf.Rect(r.x0, r.y1 - 2, r.x0 + 2, r.y1) + tiny = pymupdf.Rect(r.x0, r.y1 - 1, r.x0 + 2, r.y1) annot.set_rect(tiny) except Exception as exc: logger.debug("Shrinking annotation rect failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T193938297659Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T193939258205Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.71s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1709"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1709_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1709_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1709_1"><button class="btn btn-outline-danger"><span class="job_id">1709 : Job ID 2f122ceec752406eaf069e8a4427114a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1709_1" data-parent="#job_list___sub_accordion_1709" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1709_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=299" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (299, 59), end pos: (299, 60)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 42</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -296,7 +296,7 @@ try: # Shrink rectangle to a tiny box r = annot.rect - tiny = pymupdf.Rect(r.x0, r.y1 - 2, r.x0 + 2, r.y1) + tiny = pymupdf.Rect(r.x0, r.y1 - 2, r.x0 + 3, r.y1) annot.set_rect(tiny) except Exception as exc: logger.debug("Shrinking annotation rect failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.28s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1710"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1710_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1710_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1710_1"><button class="btn btn-outline-success"><span class="job_id">1710 : Job ID a32b6f037ad44aa589241c9c6850f86c</span></button></div></a><div aria-labelledby="job_list___sub_heading_1710_1" data-parent="#job_list___sub_accordion_1710" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1710_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=299" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (299, 59), end pos: (299, 60)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 43</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -296,7 +296,7 @@ try: # Shrink rectangle to a tiny box r = annot.rect - tiny = pymupdf.Rect(r.x0, r.y1 - 2, r.x0 + 2, r.y1) + tiny = pymupdf.Rect(r.x0, r.y1 - 2, r.x0 + 1, r.y1) annot.set_rect(tiny) except Exception as exc: logger.debug("Shrinking annotation rect failed: %s", exc)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T143303629451Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T143304513073Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 20.27s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1711"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1711_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1711_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1711_1"><button class="btn btn-outline-success"><span class="job_id">1711 : Job ID ded76fcb87f348db99bd162331a6a09c</span></button></div></a><div aria-labelledby="job_list___sub_heading_1711_1" data-parent="#job_list___sub_accordion_1711" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1711_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=44" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (44, 0), end pos: (45, 0)</button></a></pre><pre>operator: core/RemoveDecorator, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -39,9 +39,6 @@ HAS_PYMUPDF = True except Exception: HAS_PYMUPDF = False - - -@dataclass class _ObjectHash: xref: int sha256: str</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T145012881965Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T145013718826Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.16s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1712"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1712_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1712_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1712_1"><button class="btn btn-outline-success"><span class="job_id">1712 : Job ID b19b64ef585b4d66a70c89e000e9726b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1712_1" data-parent="#job_list___sub_accordion_1712" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1712_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=62" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (62, 4), end pos: (63, 0)</button></a></pre><pre>operator: core/RemoveDecorator, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -58,8 +58,6 @@ _PBKDF2_ITER: Final[int] = 120_000 _SALT_LEN: Final[int] = 16 _OBJ_SAMPLE_LIMIT: Final[int] = 12 - - @staticmethod def get_usage() -&gt; str: return ( "TamperÔÇæresistant watermark using encrypted embedded file"</pre></div><div class="alert alert-secondary"><pre class="diff">...F....FFFF.F [100%]</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1713"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1713_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1713_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1713_1"><button class="btn btn-outline-danger"><span class="job_id">1713 : Job ID 5988880244f14fbebf89bab3b5b70cf9</span></button></div></a><div aria-labelledby="job_list___sub_heading_1713_1" data-parent="#job_list___sub_accordion_1713" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1713_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=348" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (348, 4), end pos: (349, 0)</button></a></pre><pre>operator: core/RemoveDecorator, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -344,8 +344,6 @@ raise WatermarkingError( f"PDF appears tampered: object hash mismatch (xref {xref})" ) - - @staticmethod def _sha256(b: bytes) -&gt; str: h = hashes.Hash(hashes.SHA256()) h.update(b)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.14s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1714"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1714_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1714_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1714_1"><button class="btn btn-outline-danger"><span class="job_id">1714 : Job ID bebc91c40c714e2091beb6b9f125e685</span></button></div></a><div aria-labelledby="job_list___sub_heading_1714_1" data-parent="#job_list___sub_accordion_1714" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1714_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=250" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (250, 20), end pos: (250, 38)</button></a></pre><pre>operator: core/ZeroIterationForLoop, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -247,7 +247,7 @@ xref_len = doc.xref_length() except Exception: return out - for xref in range(1, xref_len): + for xref in []: if len(out) &gt;= self._OBJ_SAMPLE_LIMIT: break try:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.25s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1715"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1715_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1715_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1715_1"><button class="btn btn-outline-success"><span class="job_id">1715 : Job ID 7a38761e3816499a8f42409272f0a93c</span></button></div></a><div aria-labelledby="job_list___sub_heading_1715_1" data-parent="#job_list___sub_accordion_1715" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1715_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=signed_annotation_watermark.py&amp;line=326" class="text-secondary"><button class="btn btn-outline-dark">signed_annotation_watermark.py, start pos: (326, 17), end pos: (326, 24)</button></a></pre><pre>operator: core/ZeroIterationForLoop, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asigned_annotation_watermark.py +++ bsigned_annotation_watermark.py @@ -323,7 +323,7 @@ return None def _verify_object_hashes(self, doc: pymupdf.Document, entries: list[Any]) -&gt; None: - for e in entries: + for e in []: try: xref = int(e.get("xref")) expected = str(e.get("sha256"))</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T234237275093Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T234238228992Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.37s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1716"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1716_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1716_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1716_1"><button class="btn btn-outline-success"><span class="job_id">1716 : Job ID d6890951e63447dfbbe5b1bd43c40547</span></button></div></a><div aria-labelledby="job_list___sub_heading_1716_1" data-parent="#job_list___sub_accordion_1716" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1716_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=48" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (48, 59), end pos: (48, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Add, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -45,7 +45,7 @@ def _initialize_rmap(self) -&gt; SimpleRMAP: """Initialize the RMAP instance with proper key paths.""" # Set up paths for keys - public_keys_dir = str(Path(__file__).parent.parent / "public-keys" / "pki") + public_keys_dir = str(Path(__file__).parent.parent + "public-keys" / "pki") server_private_key = str(Path(__file__).parent / "server_priv.asc") return SimpleRMAP(</pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 15.35s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1717"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1717_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1717_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1717_1"><button class="btn btn-outline-success"><span class="job_id">1717 : Job ID 80e426a3db7741989e949415843466db</span></button></div></a><div aria-labelledby="job_list___sub_heading_1717_1" data-parent="#job_list___sub_accordion_1717" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1717_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=48" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (48, 75), end pos: (48, 76)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Add, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -45,7 +45,7 @@ def _initialize_rmap(self) -&gt; SimpleRMAP: """Initialize the RMAP instance with proper key paths.""" # Set up paths for keys - public_keys_dir = str(Path(__file__).parent.parent / "public-keys" / "pki") + public_keys_dir = str(Path(__file__).parent.parent / "public-keys" + "pki") server_private_key = str(Path(__file__).parent / "server_priv.asc") return SimpleRMAP(</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFFFF [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for +: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for +: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for +: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for +: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for +: 'WindowsPath' and 'str' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for +: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 6 failed, 8 passed, 9 warnings in 14.72s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1718"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1718_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1718_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1718_1"><button class="btn btn-outline-success"><span class="job_id">1718 : Job ID 5d5aca13f4a24a90a729baf0e267aa64</span></button></div></a><div aria-labelledby="job_list___sub_heading_1718_1" data-parent="#job_list___sub_accordion_1718" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1718_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=49" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (49, 55), end pos: (49, 56)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Add, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -46,7 +46,7 @@ """Initialize the RMAP instance with proper key paths.""" # Set up paths for keys public_keys_dir = str(Path(__file__).parent.parent / "public-keys" / "pki") - server_private_key = str(Path(__file__).parent / "server_priv.asc") + server_private_key = str(Path(__file__).parent + "server_priv.asc") return SimpleRMAP( self.storage_dir,</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFFFF [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for +: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for +: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for +: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T033014204188Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for +: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for +: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for +: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for +: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for +: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for +: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T033014489748Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for +: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for +: 'WindowsPath' and 'str' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for +: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 12 failed, 2 passed, 9 warnings in 13.97s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1719"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1719_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1719_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1719_1"><button class="btn btn-outline-success"><span class="job_id">1719 : Job ID d005c02f8f934a6986fe9abe6aae2db2</span></button></div></a><div aria-labelledby="job_list___sub_heading_1719_1" data-parent="#job_list___sub_accordion_1719" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1719_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=163" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (163, 46), end pos: (163, 47)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Add, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -160,7 +160,7 @@ # Resolve file path storage_root = Path(self.storage_dir).resolve() # Always use static/Group_13.pdf for watermarking - file_path = Path(__file__).parent / "static" / "Group_13.pdf" + file_path = Path(__file__).parent + "static" / "Group_13.pdf" file_path = file_path.resolve() if not file_path.exists():</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614efb6c39e8c9d5153b: unsupported operand type(s) for /: 'str' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 21.00s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1720"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1720_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1720_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1720_1"><button class="btn btn-outline-success"><span class="job_id">1720 : Job ID 41e848682d5b4e5b9e5b277fb56a45ba</span></button></div></a><div aria-labelledby="job_list___sub_heading_1720_1" data-parent="#job_list___sub_accordion_1720" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1720_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=163" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (163, 57), end pos: (163, 58)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Add, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -160,7 +160,7 @@ # Resolve file path storage_root = Path(self.storage_dir).resolve() # Always use static/Group_13.pdf for watermarking - file_path = Path(__file__).parent / "static" / "Group_13.pdf" + file_path = Path(__file__).parent / "static" + "Group_13.pdf" file_path = file_path.resolve() if not file_path.exists():</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ef9d32c641e72250d: unsupported operand type(s) for +: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 20.10s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1721"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1721_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1721_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1721_1"><button class="btn btn-outline-success"><span class="job_id">1721 : Job ID 1cbf3d87cdc14f33a8c1eedec32550c1</span></button></div></a><div aria-labelledby="job_list___sub_heading_1721_1" data-parent="#job_list___sub_accordion_1721" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1721_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=273" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (273, 36), end pos: (273, 37)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Add, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -270,7 +270,7 @@ return jsonify({"error": "Watermarking produced no output"}), 500 # Create destination directory and file - rmap_dir = storage_root / "rmap_watermarks" + rmap_dir = storage_root + "rmap_watermarks" rmap_dir.mkdir(parents=True, exist_ok=True) dest_filename = f"rmap_{session_secret}.pdf"</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ec203fdab0099321a: unsupported operand type(s) for +: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 20.71s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1722"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1722_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1722_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1722_1"><button class="btn btn-outline-success"><span class="job_id">1722 : Job ID 127860236eba411780ff8395bdbd7265</span></button></div></a><div aria-labelledby="job_list___sub_heading_1722_1" data-parent="#job_list___sub_accordion_1722" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1722_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=277" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (277, 33), end pos: (277, 34)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Add, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -274,7 +274,7 @@ rmap_dir.mkdir(parents=True, exist_ok=True) dest_filename = f"rmap_{session_secret}.pdf" - dest_path = rmap_dir / dest_filename + dest_path = rmap_dir + dest_filename # Write watermarked PDF with dest_path.open("wb") as f:</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ebf7e264109bda1eb: unsupported operand type(s) for +: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 20.35s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1723"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1723_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1723_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1723_1"><button class="btn btn-outline-success"><span class="job_id">1723 : Job ID 94409e292ff9495da437c003acdd9bc5</span></button></div></a><div aria-labelledby="job_list___sub_heading_1723_1" data-parent="#job_list___sub_accordion_1723" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1723_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=48" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (48, 59), end pos: (48, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Sub, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -45,7 +45,7 @@ def _initialize_rmap(self) -&gt; SimpleRMAP: """Initialize the RMAP instance with proper key paths.""" # Set up paths for keys - public_keys_dir = str(Path(__file__).parent.parent / "public-keys" / "pki") + public_keys_dir = str(Path(__file__).parent.parent - "public-keys" / "pki") server_private_key = str(Path(__file__).parent / "server_priv.asc") return SimpleRMAP(</pre></div><div class="alert alert-secondary"><pre class="diff">...F........FF [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 3 failed, 11 passed, 9 warnings in 15.18s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1724"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1724_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1724_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1724_1"><button class="btn btn-outline-success"><span class="job_id">1724 : Job ID 457953317aa54fedbacbc9c63f1a1a1a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1724_1" data-parent="#job_list___sub_accordion_1724" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1724_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=48" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (48, 75), end pos: (48, 76)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Sub, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -45,7 +45,7 @@ def _initialize_rmap(self) -&gt; SimpleRMAP: """Initialize the RMAP instance with proper key paths.""" # Set up paths for keys - public_keys_dir = str(Path(__file__).parent.parent / "public-keys" / "pki") + public_keys_dir = str(Path(__file__).parent.parent / "public-keys" - "pki") server_private_key = str(Path(__file__).parent / "server_priv.asc") return SimpleRMAP(</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFFFF [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for -: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for -: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for -: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T061720861793Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for -: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for -: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for -: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for -: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for -: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for -: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T061721064076Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for -: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for -: 'WindowsPath' and 'str' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for -: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 12 failed, 2 passed, 9 warnings in 14.30s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1725"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1725_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1725_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1725_1"><button class="btn btn-outline-success"><span class="job_id">1725 : Job ID 2298eb7dc2594387ac3d8777595a4d7a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1725_1" data-parent="#job_list___sub_accordion_1725" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1725_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=49" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (49, 55), end pos: (49, 56)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Sub, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -46,7 +46,7 @@ """Initialize the RMAP instance with proper key paths.""" # Set up paths for keys public_keys_dir = str(Path(__file__).parent.parent / "public-keys" / "pki") - server_private_key = str(Path(__file__).parent / "server_priv.asc") + server_private_key = str(Path(__file__).parent - "server_priv.asc") return SimpleRMAP( self.storage_dir,</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFFFF [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for -: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for -: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for -: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T025700848988Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for -: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for -: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for -: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for -: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T025701221697Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for -: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for -: 'WindowsPath' and 'str' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for -: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 10 failed, 4 passed, 9 warnings in 13.96s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1726"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1726_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1726_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1726_1"><button class="btn btn-outline-success"><span class="job_id">1726 : Job ID 8e5e5a866c8040b0b3ade909402b5a9e</span></button></div></a><div aria-labelledby="job_list___sub_heading_1726_1" data-parent="#job_list___sub_accordion_1726" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1726_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=163" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (163, 46), end pos: (163, 47)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Sub, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -160,7 +160,7 @@ # Resolve file path storage_root = Path(self.storage_dir).resolve() # Always use static/Group_13.pdf for watermarking - file_path = Path(__file__).parent / "static" / "Group_13.pdf" + file_path = Path(__file__).parent - "static" / "Group_13.pdf" file_path = file_path.resolve() if not file_path.exists():</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e411055a45433fe21: unsupported operand type(s) for /: 'str' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 20.29s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1727"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1727_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1727_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1727_1"><button class="btn btn-outline-success"><span class="job_id">1727 : Job ID 16ecc08cf7d5473c89ae92c3ed24b9ba</span></button></div></a><div aria-labelledby="job_list___sub_heading_1727_1" data-parent="#job_list___sub_accordion_1727" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1727_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=163" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (163, 57), end pos: (163, 58)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Sub, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -160,7 +160,7 @@ # Resolve file path storage_root = Path(self.storage_dir).resolve() # Always use static/Group_13.pdf for watermarking - file_path = Path(__file__).parent / "static" / "Group_13.pdf" + file_path = Path(__file__).parent / "static" - "Group_13.pdf" file_path = file_path.resolve() if not file_path.exists():</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614eccf0368cf534b6c1: unsupported operand type(s) for -: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 20.61s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1728"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1728_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1728_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1728_1"><button class="btn btn-outline-success"><span class="job_id">1728 : Job ID b2e593c05e3c400b94e872070ed9c18a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1728_1" data-parent="#job_list___sub_accordion_1728" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1728_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=273" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (273, 36), end pos: (273, 37)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Sub, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -270,7 +270,7 @@ return jsonify({"error": "Watermarking produced no output"}), 500 # Create destination directory and file - rmap_dir = storage_root / "rmap_watermarks" + rmap_dir = storage_root - "rmap_watermarks" rmap_dir.mkdir(parents=True, exist_ok=True) dest_filename = f"rmap_{session_secret}.pdf"</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T151156273064Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T151157242860Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e71e968bde6a03a0d: unsupported operand type(s) for -: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 9 failed, 5 passed, 22 warnings in 19.38s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1729"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1729_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1729_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1729_1"><button class="btn btn-outline-success"><span class="job_id">1729 : Job ID 3afac09e61d0443b916ed7381c503d0f</span></button></div></a><div aria-labelledby="job_list___sub_heading_1729_1" data-parent="#job_list___sub_accordion_1729" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1729_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=277" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (277, 33), end pos: (277, 34)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Sub, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -274,7 +274,7 @@ rmap_dir.mkdir(parents=True, exist_ok=True) dest_filename = f"rmap_{session_secret}.pdf" - dest_path = rmap_dir / dest_filename + dest_path = rmap_dir - dest_filename # Write watermarked PDF with dest_path.open("wb") as f:</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614eb7d5ae10bbeccc78: unsupported operand type(s) for -: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 20.29s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1730"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1730_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1730_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1730_1"><button class="btn btn-outline-success"><span class="job_id">1730 : Job ID 1a3348610ff6408384035b14898adb3b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1730_1" data-parent="#job_list___sub_accordion_1730" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1730_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=48" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (48, 59), end pos: (48, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Mul, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -45,7 +45,7 @@ def _initialize_rmap(self) -&gt; SimpleRMAP: """Initialize the RMAP instance with proper key paths.""" # Set up paths for keys - public_keys_dir = str(Path(__file__).parent.parent / "public-keys" / "pki") + public_keys_dir = str(Path(__file__).parent.parent * "public-keys" / "pki") server_private_key = str(Path(__file__).parent / "server_priv.asc") return SimpleRMAP(</pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): can't multiply sequence by non-int of type 'WindowsPath' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): can't multiply sequence by non-int of type 'WindowsPath' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 15.16s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1731"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1731_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1731_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1731_1"><button class="btn btn-outline-success"><span class="job_id">1731 : Job ID 6c539fafe7bb4841adf278673c1cb236</span></button></div></a><div aria-labelledby="job_list___sub_heading_1731_1" data-parent="#job_list___sub_accordion_1731" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1731_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=48" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (48, 75), end pos: (48, 76)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Mul, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -45,7 +45,7 @@ def _initialize_rmap(self) -&gt; SimpleRMAP: """Initialize the RMAP instance with proper key paths.""" # Set up paths for keys - public_keys_dir = str(Path(__file__).parent.parent / "public-keys" / "pki") + public_keys_dir = str(Path(__file__).parent.parent / "public-keys" * "pki") server_private_key = str(Path(__file__).parent / "server_priv.asc") return SimpleRMAP(</pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): can't multiply sequence by non-int of type 'WindowsPath' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): can't multiply sequence by non-int of type 'WindowsPath' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 15.03s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1732"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1732_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1732_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1732_1"><button class="btn btn-outline-success"><span class="job_id">1732 : Job ID 31df3010f2114075aea1acabde4bc246</span></button></div></a><div aria-labelledby="job_list___sub_heading_1732_1" data-parent="#job_list___sub_accordion_1732" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1732_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=49" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (49, 55), end pos: (49, 56)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Mul, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -46,7 +46,7 @@ """Initialize the RMAP instance with proper key paths.""" # Set up paths for keys public_keys_dir = str(Path(__file__).parent.parent / "public-keys" / "pki") - server_private_key = str(Path(__file__).parent / "server_priv.asc") + server_private_key = str(Path(__file__).parent * "server_priv.asc") return SimpleRMAP( self.storage_dir,</pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): can't multiply sequence by non-int of type 'WindowsPath' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): can't multiply sequence by non-int of type 'WindowsPath' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 15.07s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1733"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1733_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1733_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1733_1"><button class="btn btn-outline-success"><span class="job_id">1733 : Job ID 0e94e5c53f7049688d6aeb73b2a7cda1</span></button></div></a><div aria-labelledby="job_list___sub_heading_1733_1" data-parent="#job_list___sub_accordion_1733" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1733_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=163" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (163, 46), end pos: (163, 47)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Mul, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -160,7 +160,7 @@ # Resolve file path storage_root = Path(self.storage_dir).resolve() # Always use static/Group_13.pdf for watermarking - file_path = Path(__file__).parent / "static" / "Group_13.pdf" + file_path = Path(__file__).parent * "static" / "Group_13.pdf" file_path = file_path.resolve() if not file_path.exists():</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T143426500523Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T143428046650Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e6fefc693765bf503: can't multiply sequence by non-int of type 'WindowsPath' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 11 failed, 3 passed, 22 warnings in 24.81s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1734"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1734_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1734_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1734_1"><button class="btn btn-outline-success"><span class="job_id">1734 : Job ID 9821dab3794d41a1ab639dc7a987efbf</span></button></div></a><div aria-labelledby="job_list___sub_heading_1734_1" data-parent="#job_list___sub_accordion_1734" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1734_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=163" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (163, 57), end pos: (163, 58)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Mul, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -160,7 +160,7 @@ # Resolve file path storage_root = Path(self.storage_dir).resolve() # Always use static/Group_13.pdf for watermarking - file_path = Path(__file__).parent / "static" / "Group_13.pdf" + file_path = Path(__file__).parent / "static" * "Group_13.pdf" file_path = file_path.resolve() if not file_path.exists():</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e15873989e843ef2e: can't multiply sequence by non-int of type 'WindowsPath' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 21.18s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1735"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1735_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1735_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1735_1"><button class="btn btn-outline-success"><span class="job_id">1735 : Job ID 38092421f3494fc090530716ee217feb</span></button></div></a><div aria-labelledby="job_list___sub_heading_1735_1" data-parent="#job_list___sub_accordion_1735" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1735_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=273" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (273, 36), end pos: (273, 37)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Mul, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -270,7 +270,7 @@ return jsonify({"error": "Watermarking produced no output"}), 500 # Create destination directory and file - rmap_dir = storage_root / "rmap_watermarks" + rmap_dir = storage_root * "rmap_watermarks" rmap_dir.mkdir(parents=True, exist_ok=True) dest_filename = f"rmap_{session_secret}.pdf"</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614eae7dc742549979f5: can't multiply sequence by non-int of type 'WindowsPath' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 20.24s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1736"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1736_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1736_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1736_1"><button class="btn btn-outline-success"><span class="job_id">1736 : Job ID 2dff6e6789ac47dfa65f42b0a2752383</span></button></div></a><div aria-labelledby="job_list___sub_heading_1736_1" data-parent="#job_list___sub_accordion_1736" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1736_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=277" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (277, 33), end pos: (277, 34)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Mul, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -274,7 +274,7 @@ rmap_dir.mkdir(parents=True, exist_ok=True) dest_filename = f"rmap_{session_secret}.pdf" - dest_path = rmap_dir / dest_filename + dest_path = rmap_dir * dest_filename # Write watermarked PDF with dest_path.open("wb") as f:</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ec94782e9ee20507b: can't multiply sequence by non-int of type 'WindowsPath' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.76s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1737"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1737_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1737_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1737_1"><button class="btn btn-outline-success"><span class="job_id">1737 : Job ID c51e8c5081104791add4de5983246eda</span></button></div></a><div aria-labelledby="job_list___sub_heading_1737_1" data-parent="#job_list___sub_accordion_1737" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1737_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=48" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (48, 59), end pos: (48, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_FloorDiv, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -45,7 +45,7 @@ def _initialize_rmap(self) -&gt; SimpleRMAP: """Initialize the RMAP instance with proper key paths.""" # Set up paths for keys - public_keys_dir = str(Path(__file__).parent.parent / "public-keys" / "pki") + public_keys_dir = str(Path(__file__).parent.parent // "public-keys" / "pki") server_private_key = str(Path(__file__).parent / "server_priv.asc") return SimpleRMAP(</pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for //: 'WindowsPath' and 'str' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for //: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 15.00s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1738"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1738_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1738_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1738_1"><button class="btn btn-outline-success"><span class="job_id">1738 : Job ID 90ba781c6cda46689bed66935c40d48d</span></button></div></a><div aria-labelledby="job_list___sub_heading_1738_1" data-parent="#job_list___sub_accordion_1738" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1738_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=48" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (48, 75), end pos: (48, 76)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_FloorDiv, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -45,7 +45,7 @@ def _initialize_rmap(self) -&gt; SimpleRMAP: """Initialize the RMAP instance with proper key paths.""" # Set up paths for keys - public_keys_dir = str(Path(__file__).parent.parent / "public-keys" / "pki") + public_keys_dir = str(Path(__file__).parent.parent / "public-keys" // "pki") server_private_key = str(Path(__file__).parent / "server_priv.asc") return SimpleRMAP(</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFFFF [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for //: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for //: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for //: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T232731797824Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for //: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for //: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for //: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for //: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for //: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for //: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T232732105008Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for //: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for //: 'WindowsPath' and 'str' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for //: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 12 failed, 2 passed, 9 warnings in 13.98s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1739"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1739_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1739_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1739_1"><button class="btn btn-outline-success"><span class="job_id">1739 : Job ID 3198ac92499e488b85219abd0c97caa8</span></button></div></a><div aria-labelledby="job_list___sub_heading_1739_1" data-parent="#job_list___sub_accordion_1739" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1739_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=49" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (49, 55), end pos: (49, 56)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_FloorDiv, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -46,7 +46,7 @@ """Initialize the RMAP instance with proper key paths.""" # Set up paths for keys public_keys_dir = str(Path(__file__).parent.parent / "public-keys" / "pki") - server_private_key = str(Path(__file__).parent / "server_priv.asc") + server_private_key = str(Path(__file__).parent // "server_priv.asc") return SimpleRMAP( self.storage_dir,</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFFFF [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for //: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for //: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for //: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for //: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for //: 'WindowsPath' and 'str' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for //: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 6 failed, 8 passed, 9 warnings in 14.58s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1740"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1740_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1740_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1740_1"><button class="btn btn-outline-success"><span class="job_id">1740 : Job ID 4cc856113d8742e3b2b8fb78d103755b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1740_1" data-parent="#job_list___sub_accordion_1740" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1740_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=163" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (163, 46), end pos: (163, 47)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_FloorDiv, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -160,7 +160,7 @@ # Resolve file path storage_root = Path(self.storage_dir).resolve() # Always use static/Group_13.pdf for watermarking - file_path = Path(__file__).parent / "static" / "Group_13.pdf" + file_path = Path(__file__).parent // "static" / "Group_13.pdf" file_path = file_path.resolve() if not file_path.exists():</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e9fcc0e4c5d725253: unsupported operand type(s) for //: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 20.31s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1741"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1741_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1741_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1741_1"><button class="btn btn-outline-success"><span class="job_id">1741 : Job ID 2fc30c8467484484b7837e7f28250cd0</span></button></div></a><div aria-labelledby="job_list___sub_heading_1741_1" data-parent="#job_list___sub_accordion_1741" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1741_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=163" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (163, 57), end pos: (163, 58)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_FloorDiv, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -160,7 +160,7 @@ # Resolve file path storage_root = Path(self.storage_dir).resolve() # Always use static/Group_13.pdf for watermarking - file_path = Path(__file__).parent / "static" / "Group_13.pdf" + file_path = Path(__file__).parent / "static" // "Group_13.pdf" file_path = file_path.resolve() if not file_path.exists():</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e1c3690bb2d4b1f05: unsupported operand type(s) for //: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 20.45s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1742"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1742_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1742_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1742_1"><button class="btn btn-outline-success"><span class="job_id">1742 : Job ID dc1f712d103f4f49a9911b2c38999ea3</span></button></div></a><div aria-labelledby="job_list___sub_heading_1742_1" data-parent="#job_list___sub_accordion_1742" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1742_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=273" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (273, 36), end pos: (273, 37)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_FloorDiv, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -270,7 +270,7 @@ return jsonify({"error": "Watermarking produced no output"}), 500 # Create destination directory and file - rmap_dir = storage_root / "rmap_watermarks" + rmap_dir = storage_root // "rmap_watermarks" rmap_dir.mkdir(parents=True, exist_ok=True) dest_filename = f"rmap_{session_secret}.pdf"</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ecea4bb23de7f72b9: unsupported operand type(s) for //: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 20.43s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1743"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1743_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1743_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1743_1"><button class="btn btn-outline-success"><span class="job_id">1743 : Job ID 4b98226151e144f495d67f93aef814ad</span></button></div></a><div aria-labelledby="job_list___sub_heading_1743_1" data-parent="#job_list___sub_accordion_1743" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1743_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=277" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (277, 33), end pos: (277, 34)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_FloorDiv, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -274,7 +274,7 @@ rmap_dir.mkdir(parents=True, exist_ok=True) dest_filename = f"rmap_{session_secret}.pdf" - dest_path = rmap_dir / dest_filename + dest_path = rmap_dir // dest_filename # Write watermarked PDF with dest_path.open("wb") as f:</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e8f6a92bc848dc915: unsupported operand type(s) for //: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 20.20s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1744"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1744_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1744_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1744_1"><button class="btn btn-outline-success"><span class="job_id">1744 : Job ID 63fac846fb1a469c9bc19c43c1a3dcf1</span></button></div></a><div aria-labelledby="job_list___sub_heading_1744_1" data-parent="#job_list___sub_accordion_1744" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1744_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=48" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (48, 59), end pos: (48, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Mod, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -45,7 +45,7 @@ def _initialize_rmap(self) -&gt; SimpleRMAP: """Initialize the RMAP instance with proper key paths.""" # Set up paths for keys - public_keys_dir = str(Path(__file__).parent.parent / "public-keys" / "pki") + public_keys_dir = str(Path(__file__).parent.parent % "public-keys" / "pki") server_private_key = str(Path(__file__).parent / "server_priv.asc") return SimpleRMAP(</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFFFF [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for %: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for %: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for %: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T020015130415Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for %: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for %: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for %: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for %: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for %: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for %: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T020015400657Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for %: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for %: 'WindowsPath' and 'str' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for %: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 12 failed, 2 passed, 9 warnings in 13.86s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1745"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1745_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1745_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1745_1"><button class="btn btn-outline-success"><span class="job_id">1745 : Job ID 2a3921303a494e2d95011e1d59a58e24</span></button></div></a><div aria-labelledby="job_list___sub_heading_1745_1" data-parent="#job_list___sub_accordion_1745" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1745_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=48" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (48, 75), end pos: (48, 76)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Mod, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -45,7 +45,7 @@ def _initialize_rmap(self) -&gt; SimpleRMAP: """Initialize the RMAP instance with proper key paths.""" # Set up paths for keys - public_keys_dir = str(Path(__file__).parent.parent / "public-keys" / "pki") + public_keys_dir = str(Path(__file__).parent.parent / "public-keys" % "pki") server_private_key = str(Path(__file__).parent / "server_priv.asc") return SimpleRMAP(</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFFFF [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for %: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for %: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for %: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for %: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for %: 'WindowsPath' and 'str' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for %: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 6 failed, 8 passed, 9 warnings in 14.91s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1746"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1746_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1746_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1746_1"><button class="btn btn-outline-success"><span class="job_id">1746 : Job ID aff59299acb148cebdb42ba3790dbe59</span></button></div></a><div aria-labelledby="job_list___sub_heading_1746_1" data-parent="#job_list___sub_accordion_1746" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1746_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=49" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (49, 55), end pos: (49, 56)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Mod, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -46,7 +46,7 @@ """Initialize the RMAP instance with proper key paths.""" # Set up paths for keys public_keys_dir = str(Path(__file__).parent.parent / "public-keys" / "pki") - server_private_key = str(Path(__file__).parent / "server_priv.asc") + server_private_key = str(Path(__file__).parent % "server_priv.asc") return SimpleRMAP( self.storage_dir,</pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for %: 'WindowsPath' and 'str' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for %: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 15.35s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1747"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1747_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1747_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1747_1"><button class="btn btn-outline-success"><span class="job_id">1747 : Job ID 9df01761ae19482ebc8ab3e824a8d79c</span></button></div></a><div aria-labelledby="job_list___sub_heading_1747_1" data-parent="#job_list___sub_accordion_1747" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1747_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=163" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (163, 46), end pos: (163, 47)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Mod, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -160,7 +160,7 @@ # Resolve file path storage_root = Path(self.storage_dir).resolve() # Always use static/Group_13.pdf for watermarking - file_path = Path(__file__).parent / "static" / "Group_13.pdf" + file_path = Path(__file__).parent % "static" / "Group_13.pdf" file_path = file_path.resolve() if not file_path.exists():</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T212946314746Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T212947238850Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614eb76487060e8237df: unsupported operand type(s) for %: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 9 failed, 5 passed, 22 warnings in 19.24s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1748"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1748_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1748_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1748_1"><button class="btn btn-outline-success"><span class="job_id">1748 : Job ID d999496f810c4d819eb88c2b96030efb</span></button></div></a><div aria-labelledby="job_list___sub_heading_1748_1" data-parent="#job_list___sub_accordion_1748" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1748_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=163" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (163, 57), end pos: (163, 58)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Mod, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -160,7 +160,7 @@ # Resolve file path storage_root = Path(self.storage_dir).resolve() # Always use static/Group_13.pdf for watermarking - file_path = Path(__file__).parent / "static" / "Group_13.pdf" + file_path = Path(__file__).parent / "static" % "Group_13.pdf" file_path = file_path.resolve() if not file_path.exists():</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e1e4022b865b7bb27: unsupported operand type(s) for %: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 20.77s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1749"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1749_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1749_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1749_1"><button class="btn btn-outline-success"><span class="job_id">1749 : Job ID e417e0c32ca34ab3987022735133df41</span></button></div></a><div aria-labelledby="job_list___sub_heading_1749_1" data-parent="#job_list___sub_accordion_1749" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1749_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=273" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (273, 36), end pos: (273, 37)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Mod, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -270,7 +270,7 @@ return jsonify({"error": "Watermarking produced no output"}), 500 # Create destination directory and file - rmap_dir = storage_root / "rmap_watermarks" + rmap_dir = storage_root % "rmap_watermarks" rmap_dir.mkdir(parents=True, exist_ok=True) dest_filename = f"rmap_{session_secret}.pdf"</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%]</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1750"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1750_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1750_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1750_1"><button class="btn btn-outline-success"><span class="job_id">1750 : Job ID d977a9d1d1584af0bf24a589aeca6557</span></button></div></a><div aria-labelledby="job_list___sub_heading_1750_1" data-parent="#job_list___sub_accordion_1750" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1750_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=277" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (277, 33), end pos: (277, 34)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Mod, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -274,7 +274,7 @@ rmap_dir.mkdir(parents=True, exist_ok=True) dest_filename = f"rmap_{session_secret}.pdf" - dest_path = rmap_dir / dest_filename + dest_path = rmap_dir % dest_filename # Write watermarked PDF with dest_path.open("wb") as f:</pre></div><div class="alert alert-secondary"><pre class="diff">...F.........F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:228: in open request = self._request_from_builder_args(args, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:200: in _request_from_builder_args return builder.get_request() ^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:764: in get_request return cls(self.get_environ()) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:688: in get_environ input_stream, content_length, boundary = stream_encode_multipart( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:130: in stream_encode_multipart write_binary(encoder.send_event(Data(data=chunk, more_data=True))) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:81: in write_binary return stream.write(s) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e2c011fb4173378f0: unsupported operand type(s) for %: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 2 failed, 12 passed, 22 warnings in 21.33s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1751"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1751_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1751_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1751_1"><button class="btn btn-outline-success"><span class="job_id">1751 : Job ID e5667c58f81b45409b7af18cf060f483</span></button></div></a><div aria-labelledby="job_list___sub_heading_1751_1" data-parent="#job_list___sub_accordion_1751" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1751_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=48" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (48, 59), end pos: (48, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Pow, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -45,7 +45,7 @@ def _initialize_rmap(self) -&gt; SimpleRMAP: """Initialize the RMAP instance with proper key paths.""" # Set up paths for keys - public_keys_dir = str(Path(__file__).parent.parent / "public-keys" / "pki") + public_keys_dir = str(Path(__file__).parent.parent ** "public-keys" / "pki") server_private_key = str(Path(__file__).parent / "server_priv.asc") return SimpleRMAP(</pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for ** or pow(): 'WindowsPath' and 'str' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for ** or pow(): 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 14.76s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1752"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1752_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1752_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1752_1"><button class="btn btn-outline-success"><span class="job_id">1752 : Job ID 523f21d425c14498879bf53c02404915</span></button></div></a><div aria-labelledby="job_list___sub_heading_1752_1" data-parent="#job_list___sub_accordion_1752" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1752_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=48" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (48, 75), end pos: (48, 76)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Pow, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -45,7 +45,7 @@ def _initialize_rmap(self) -&gt; SimpleRMAP: """Initialize the RMAP instance with proper key paths.""" # Set up paths for keys - public_keys_dir = str(Path(__file__).parent.parent / "public-keys" / "pki") + public_keys_dir = str(Path(__file__).parent.parent / "public-keys" ** "pki") server_private_key = str(Path(__file__).parent / "server_priv.asc") return SimpleRMAP(</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFFFF [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for ** or pow(): 'str' and 'str' ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for ** or pow(): 'str' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for ** or pow(): 'str' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for ** or pow(): 'str' and 'str' ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for ** or pow(): 'str' and 'str' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for ** or pow(): 'str' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 6 failed, 8 passed, 9 warnings in 14.63s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1753"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1753_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1753_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1753_1"><button class="btn btn-outline-success"><span class="job_id">1753 : Job ID 808246b7be404eb28ef6c9899415532a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1753_1" data-parent="#job_list___sub_accordion_1753" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1753_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=49" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (49, 55), end pos: (49, 56)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Pow, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -46,7 +46,7 @@ """Initialize the RMAP instance with proper key paths.""" # Set up paths for keys public_keys_dir = str(Path(__file__).parent.parent / "public-keys" / "pki") - server_private_key = str(Path(__file__).parent / "server_priv.asc") + server_private_key = str(Path(__file__).parent ** "server_priv.asc") return SimpleRMAP( self.storage_dir,</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFFFF [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for ** or pow(): 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for ** or pow(): 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for ** or pow(): 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T035610876569Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for ** or pow(): 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for ** or pow(): 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for ** or pow(): 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for ** or pow(): 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for ** or pow(): 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for ** or pow(): 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T035611107823Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for ** or pow(): 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for ** or pow(): 'WindowsPath' and 'str' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for ** or pow(): 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 12 failed, 2 passed, 9 warnings in 14.20s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1754"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1754_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1754_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1754_1"><button class="btn btn-outline-success"><span class="job_id">1754 : Job ID bd1722beb92c4f66ad032d849f324ae5</span></button></div></a><div aria-labelledby="job_list___sub_heading_1754_1" data-parent="#job_list___sub_accordion_1754" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1754_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=163" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (163, 46), end pos: (163, 47)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Pow, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -160,7 +160,7 @@ # Resolve file path storage_root = Path(self.storage_dir).resolve() # Always use static/Group_13.pdf for watermarking - file_path = Path(__file__).parent / "static" / "Group_13.pdf" + file_path = Path(__file__).parent ** "static" / "Group_13.pdf" file_path = file_path.resolve() if not file_path.exists():</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T045417515250Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T045418397904Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ed6869d147629d095: unsupported operand type(s) for ** or pow(): 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 11 failed, 3 passed, 22 warnings in 19.77s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1755"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1755_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1755_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1755_1"><button class="btn btn-outline-success"><span class="job_id">1755 : Job ID 8bf59e706b5a464da97588a381795f6b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1755_1" data-parent="#job_list___sub_accordion_1755" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1755_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=163" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (163, 57), end pos: (163, 58)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Pow, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -160,7 +160,7 @@ # Resolve file path storage_root = Path(self.storage_dir).resolve() # Always use static/Group_13.pdf for watermarking - file_path = Path(__file__).parent / "static" / "Group_13.pdf" + file_path = Path(__file__).parent / "static" ** "Group_13.pdf" file_path = file_path.resolve() if not file_path.exists():</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614eddadc29155bef3b3: unsupported operand type(s) for ** or pow(): 'str' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 20.40s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1756"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1756_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1756_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1756_1"><button class="btn btn-outline-success"><span class="job_id">1756 : Job ID d33dc32c82b84db3a397da81c5c6594f</span></button></div></a><div aria-labelledby="job_list___sub_heading_1756_1" data-parent="#job_list___sub_accordion_1756" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1756_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=273" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (273, 36), end pos: (273, 37)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Pow, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -270,7 +270,7 @@ return jsonify({"error": "Watermarking produced no output"}), 500 # Create destination directory and file - rmap_dir = storage_root / "rmap_watermarks" + rmap_dir = storage_root ** "rmap_watermarks" rmap_dir.mkdir(parents=True, exist_ok=True) dest_filename = f"rmap_{session_secret}.pdf"</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e7c9ba830040d8a45: unsupported operand type(s) for ** or pow(): 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 20.34s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1757"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1757_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1757_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1757_1"><button class="btn btn-outline-success"><span class="job_id">1757 : Job ID fb8fb23482a745ec90df27d9b96cbfac</span></button></div></a><div aria-labelledby="job_list___sub_heading_1757_1" data-parent="#job_list___sub_accordion_1757" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1757_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=277" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (277, 33), end pos: (277, 34)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Pow, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -274,7 +274,7 @@ rmap_dir.mkdir(parents=True, exist_ok=True) dest_filename = f"rmap_{session_secret}.pdf" - dest_path = rmap_dir / dest_filename + dest_path = rmap_dir ** dest_filename # Write watermarked PDF with dest_path.open("wb") as f:</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e4a4e25a95549d47c: unsupported operand type(s) for ** or pow(): 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.82s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1758"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1758_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1758_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1758_1"><button class="btn btn-outline-success"><span class="job_id">1758 : Job ID bc142c3bf19e46759a4a7214f6f33076</span></button></div></a><div aria-labelledby="job_list___sub_heading_1758_1" data-parent="#job_list___sub_accordion_1758" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1758_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=48" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (48, 59), end pos: (48, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_RShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -45,7 +45,7 @@ def _initialize_rmap(self) -&gt; SimpleRMAP: """Initialize the RMAP instance with proper key paths.""" # Set up paths for keys - public_keys_dir = str(Path(__file__).parent.parent / "public-keys" / "pki") + public_keys_dir = str(Path(__file__).parent.parent &gt;&gt; "public-keys" / "pki") server_private_key = str(Path(__file__).parent / "server_priv.asc") return SimpleRMAP(</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFFFF [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T034710681924Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T034710916176Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 12 failed, 2 passed, 9 warnings in 13.96s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1759"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1759_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1759_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1759_1"><button class="btn btn-outline-success"><span class="job_id">1759 : Job ID 9b3d2781c79c4f91bd91f9d23a9d4c68</span></button></div></a><div aria-labelledby="job_list___sub_heading_1759_1" data-parent="#job_list___sub_accordion_1759" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1759_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=48" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (48, 75), end pos: (48, 76)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_RShift, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -45,7 +45,7 @@ def _initialize_rmap(self) -&gt; SimpleRMAP: """Initialize the RMAP instance with proper key paths.""" # Set up paths for keys - public_keys_dir = str(Path(__file__).parent.parent / "public-keys" / "pki") + public_keys_dir = str(Path(__file__).parent.parent / "public-keys" &gt;&gt; "pki") server_private_key = str(Path(__file__).parent / "server_priv.asc") return SimpleRMAP(</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFFFF [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for &gt;&gt;: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for &gt;&gt;: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for &gt;&gt;: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for &gt;&gt;: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for &gt;&gt;: 'WindowsPath' and 'str' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for &gt;&gt;: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 6 failed, 8 passed, 9 warnings in 14.40s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1760"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1760_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1760_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1760_1"><button class="btn btn-outline-success"><span class="job_id">1760 : Job ID d6660ce8bc23478f847397fd89fb47b1</span></button></div></a><div aria-labelledby="job_list___sub_heading_1760_1" data-parent="#job_list___sub_accordion_1760" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1760_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=49" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (49, 55), end pos: (49, 56)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_RShift, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -46,7 +46,7 @@ """Initialize the RMAP instance with proper key paths.""" # Set up paths for keys public_keys_dir = str(Path(__file__).parent.parent / "public-keys" / "pki") - server_private_key = str(Path(__file__).parent / "server_priv.asc") + server_private_key = str(Path(__file__).parent &gt;&gt; "server_priv.asc") return SimpleRMAP( self.storage_dir,</pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for &gt;&gt;: 'WindowsPath' and 'str' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for &gt;&gt;: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 15.20s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1761"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1761_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1761_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1761_1"><button class="btn btn-outline-success"><span class="job_id">1761 : Job ID 7309b21d021948f68f65fd4e756fd206</span></button></div></a><div aria-labelledby="job_list___sub_heading_1761_1" data-parent="#job_list___sub_accordion_1761" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1761_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=163" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (163, 46), end pos: (163, 47)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_RShift, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -160,7 +160,7 @@ # Resolve file path storage_root = Path(self.storage_dir).resolve() # Always use static/Group_13.pdf for watermarking - file_path = Path(__file__).parent / "static" / "Group_13.pdf" + file_path = Path(__file__).parent &gt;&gt; "static" / "Group_13.pdf" file_path = file_path.resolve() if not file_path.exists():</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T193509610859Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T193510507025Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614edd6847922cb6b2a7: unsupported operand type(s) for /: 'str' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 10 failed, 4 passed, 22 warnings in 19.52s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1762"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1762_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1762_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1762_1"><button class="btn btn-outline-success"><span class="job_id">1762 : Job ID 62d3bec6fd7f499fa1237ab206721219</span></button></div></a><div aria-labelledby="job_list___sub_heading_1762_1" data-parent="#job_list___sub_accordion_1762" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1762_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=163" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (163, 57), end pos: (163, 58)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_RShift, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -160,7 +160,7 @@ # Resolve file path storage_root = Path(self.storage_dir).resolve() # Always use static/Group_13.pdf for watermarking - file_path = Path(__file__).parent / "static" / "Group_13.pdf" + file_path = Path(__file__).parent / "static" &gt;&gt; "Group_13.pdf" file_path = file_path.resolve() if not file_path.exists():</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e0a8d5d118a2a40ad: unsupported operand type(s) for &gt;&gt;: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 20.69s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1763"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1763_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1763_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1763_1"><button class="btn btn-outline-success"><span class="job_id">1763 : Job ID 496d57bde6234d05841e7d29c48ab035</span></button></div></a><div aria-labelledby="job_list___sub_heading_1763_1" data-parent="#job_list___sub_accordion_1763" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1763_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=273" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (273, 36), end pos: (273, 37)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_RShift, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -270,7 +270,7 @@ return jsonify({"error": "Watermarking produced no output"}), 500 # Create destination directory and file - rmap_dir = storage_root / "rmap_watermarks" + rmap_dir = storage_root &gt;&gt; "rmap_watermarks" rmap_dir.mkdir(parents=True, exist_ok=True) dest_filename = f"rmap_{session_secret}.pdf"</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ed1940bf6d0809eea: unsupported operand type(s) for &gt;&gt;: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 20.54s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1764"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1764_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1764_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1764_1"><button class="btn btn-outline-success"><span class="job_id">1764 : Job ID 78c44f8f451844ceb4181490a8b23f8e</span></button></div></a><div aria-labelledby="job_list___sub_heading_1764_1" data-parent="#job_list___sub_accordion_1764" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1764_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=277" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (277, 33), end pos: (277, 34)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_RShift, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -274,7 +274,7 @@ rmap_dir.mkdir(parents=True, exist_ok=True) dest_filename = f"rmap_{session_secret}.pdf" - dest_path = rmap_dir / dest_filename + dest_path = rmap_dir &gt;&gt; dest_filename # Write watermarked PDF with dest_path.open("wb") as f:</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e4d3e6a983f69fde8: unsupported operand type(s) for &gt;&gt;: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 20.26s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1765"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1765_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1765_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1765_1"><button class="btn btn-outline-success"><span class="job_id">1765 : Job ID 373c1fe184e441c8adf6670b21e2ec38</span></button></div></a><div aria-labelledby="job_list___sub_heading_1765_1" data-parent="#job_list___sub_accordion_1765" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1765_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=48" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (48, 59), end pos: (48, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_LShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -45,7 +45,7 @@ def _initialize_rmap(self) -&gt; SimpleRMAP: """Initialize the RMAP instance with proper key paths.""" # Set up paths for keys - public_keys_dir = str(Path(__file__).parent.parent / "public-keys" / "pki") + public_keys_dir = str(Path(__file__).parent.parent &lt;&lt; "public-keys" / "pki") server_private_key = str(Path(__file__).parent / "server_priv.asc") return SimpleRMAP(</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFFFF [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T155944622602Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T155944842893Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 12 failed, 2 passed, 9 warnings in 13.70s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1766"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1766_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1766_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1766_1"><button class="btn btn-outline-success"><span class="job_id">1766 : Job ID 0f21793b1cc3439484288277bfccb99b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1766_1" data-parent="#job_list___sub_accordion_1766" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1766_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=48" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (48, 75), end pos: (48, 76)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_LShift, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -45,7 +45,7 @@ def _initialize_rmap(self) -&gt; SimpleRMAP: """Initialize the RMAP instance with proper key paths.""" # Set up paths for keys - public_keys_dir = str(Path(__file__).parent.parent / "public-keys" / "pki") + public_keys_dir = str(Path(__file__).parent.parent / "public-keys" &lt;&lt; "pki") server_private_key = str(Path(__file__).parent / "server_priv.asc") return SimpleRMAP(</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....F..FF [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for &lt;&lt;: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for &lt;&lt;: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for &lt;&lt;: 'WindowsPath' and 'str' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for &lt;&lt;: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 4 failed, 10 passed, 9 warnings in 15.35s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1767"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1767_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1767_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1767_1"><button class="btn btn-outline-success"><span class="job_id">1767 : Job ID 4fae4f6553964c0292407473a16c793b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1767_1" data-parent="#job_list___sub_accordion_1767" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1767_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=49" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (49, 55), end pos: (49, 56)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_LShift, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -46,7 +46,7 @@ """Initialize the RMAP instance with proper key paths.""" # Set up paths for keys public_keys_dir = str(Path(__file__).parent.parent / "public-keys" / "pki") - server_private_key = str(Path(__file__).parent / "server_priv.asc") + server_private_key = str(Path(__file__).parent &lt;&lt; "server_priv.asc") return SimpleRMAP( self.storage_dir,</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFFFF [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for &lt;&lt;: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for &lt;&lt;: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for &lt;&lt;: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T201313447313Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for &lt;&lt;: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for &lt;&lt;: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for &lt;&lt;: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for &lt;&lt;: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for &lt;&lt;: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for &lt;&lt;: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T201313744984Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for &lt;&lt;: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for &lt;&lt;: 'WindowsPath' and 'str' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for &lt;&lt;: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 12 failed, 2 passed, 9 warnings in 14.05s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1768"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1768_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1768_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1768_1"><button class="btn btn-outline-success"><span class="job_id">1768 : Job ID b62d3622266d4277801781559786aa77</span></button></div></a><div aria-labelledby="job_list___sub_heading_1768_1" data-parent="#job_list___sub_accordion_1768" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1768_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=163" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (163, 46), end pos: (163, 47)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_LShift, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -160,7 +160,7 @@ # Resolve file path storage_root = Path(self.storage_dir).resolve() # Always use static/Group_13.pdf for watermarking - file_path = Path(__file__).parent / "static" / "Group_13.pdf" + file_path = Path(__file__).parent &lt;&lt; "static" / "Group_13.pdf" file_path = file_path.resolve() if not file_path.exists():</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e24003f79c1b04435: unsupported operand type(s) for /: 'str' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 21.52s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1769"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1769_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1769_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1769_1"><button class="btn btn-outline-success"><span class="job_id">1769 : Job ID 4b3c03f0c3344be5a3ff60c79cc7dbe0</span></button></div></a><div aria-labelledby="job_list___sub_heading_1769_1" data-parent="#job_list___sub_accordion_1769" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1769_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=163" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (163, 57), end pos: (163, 58)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_LShift, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -160,7 +160,7 @@ # Resolve file path storage_root = Path(self.storage_dir).resolve() # Always use static/Group_13.pdf for watermarking - file_path = Path(__file__).parent / "static" / "Group_13.pdf" + file_path = Path(__file__).parent / "static" &lt;&lt; "Group_13.pdf" file_path = file_path.resolve() if not file_path.exists():</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ef57f7ca9083ea6ac: unsupported operand type(s) for &lt;&lt;: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 20.36s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1770"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1770_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1770_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1770_1"><button class="btn btn-outline-success"><span class="job_id">1770 : Job ID 4eb0c6e0ddfc4f6190d79bed238c2865</span></button></div></a><div aria-labelledby="job_list___sub_heading_1770_1" data-parent="#job_list___sub_accordion_1770" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1770_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=273" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (273, 36), end pos: (273, 37)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_LShift, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -270,7 +270,7 @@ return jsonify({"error": "Watermarking produced no output"}), 500 # Create destination directory and file - rmap_dir = storage_root / "rmap_watermarks" + rmap_dir = storage_root &lt;&lt; "rmap_watermarks" rmap_dir.mkdir(parents=True, exist_ok=True) dest_filename = f"rmap_{session_secret}.pdf"</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T055310159621Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T055311118308Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e70e47f22e389792c: unsupported operand type(s) for &lt;&lt;: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 9 failed, 5 passed, 22 warnings in 19.54s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1771"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1771_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1771_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1771_1"><button class="btn btn-outline-success"><span class="job_id">1771 : Job ID fef7c8d12556417cb74715aff0ca86e7</span></button></div></a><div aria-labelledby="job_list___sub_heading_1771_1" data-parent="#job_list___sub_accordion_1771" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1771_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=277" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (277, 33), end pos: (277, 34)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_LShift, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -274,7 +274,7 @@ rmap_dir.mkdir(parents=True, exist_ok=True) dest_filename = f"rmap_{session_secret}.pdf" - dest_path = rmap_dir / dest_filename + dest_path = rmap_dir &lt;&lt; dest_filename # Write watermarked PDF with dest_path.open("wb") as f:</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ed7ef90e986cec5dc: unsupported operand type(s) for &lt;&lt;: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 20.38s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1772"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1772_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1772_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1772_1"><button class="btn btn-outline-success"><span class="job_id">1772 : Job ID 0e959bdb4ec1418bb080452307601e9a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1772_1" data-parent="#job_list___sub_accordion_1772" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1772_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=48" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (48, 59), end pos: (48, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitOr, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -45,7 +45,7 @@ def _initialize_rmap(self) -&gt; SimpleRMAP: """Initialize the RMAP instance with proper key paths.""" # Set up paths for keys - public_keys_dir = str(Path(__file__).parent.parent / "public-keys" / "pki") + public_keys_dir = str(Path(__file__).parent.parent | "public-keys" / "pki") server_private_key = str(Path(__file__).parent / "server_priv.asc") return SimpleRMAP(</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFFFF [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T195506234617Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T195506563015Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 10 failed, 4 passed, 9 warnings in 14.15s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1773"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1773_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1773_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1773_1"><button class="btn btn-outline-success"><span class="job_id">1773 : Job ID c2355a375ce744e185931ceb26e975b4</span></button></div></a><div aria-labelledby="job_list___sub_heading_1773_1" data-parent="#job_list___sub_accordion_1773" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1773_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=48" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (48, 75), end pos: (48, 76)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitOr, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -45,7 +45,7 @@ def _initialize_rmap(self) -&gt; SimpleRMAP: """Initialize the RMAP instance with proper key paths.""" # Set up paths for keys - public_keys_dir = str(Path(__file__).parent.parent / "public-keys" / "pki") + public_keys_dir = str(Path(__file__).parent.parent / "public-keys" | "pki") server_private_key = str(Path(__file__).parent / "server_priv.asc") return SimpleRMAP(</pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for |: 'WindowsPath' and 'str' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for |: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 15.22s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1774"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1774_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1774_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1774_1"><button class="btn btn-outline-success"><span class="job_id">1774 : Job ID 650c61cd496b4cebb2f8cc726864d724</span></button></div></a><div aria-labelledby="job_list___sub_heading_1774_1" data-parent="#job_list___sub_accordion_1774" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1774_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=49" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (49, 55), end pos: (49, 56)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitOr, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -46,7 +46,7 @@ """Initialize the RMAP instance with proper key paths.""" # Set up paths for keys public_keys_dir = str(Path(__file__).parent.parent / "public-keys" / "pki") - server_private_key = str(Path(__file__).parent / "server_priv.asc") + server_private_key = str(Path(__file__).parent | "server_priv.asc") return SimpleRMAP( self.storage_dir,</pre></div><div class="alert alert-secondary"><pre class="diff">...F........FF [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:228: in open request = self._request_from_builder_args(args, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:200: in _request_from_builder_args return builder.get_request() ^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:764: in get_request return cls(self.get_environ()) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:688: in get_environ input_stream, content_length, boundary = stream_encode_multipart( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:130: in stream_encode_multipart write_binary(encoder.send_event(Data(data=chunk, more_data=True))) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:81: in write_binary return stream.write(s) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for |: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for |: 'WindowsPath' and 'str' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for |: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 3 failed, 11 passed, 9 warnings in 15.16s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1775"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1775_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1775_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1775_1"><button class="btn btn-outline-success"><span class="job_id">1775 : Job ID bb024081155d464a82dba92d0973cb24</span></button></div></a><div aria-labelledby="job_list___sub_heading_1775_1" data-parent="#job_list___sub_accordion_1775" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1775_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=163" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (163, 46), end pos: (163, 47)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitOr, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -160,7 +160,7 @@ # Resolve file path storage_root = Path(self.storage_dir).resolve() # Always use static/Group_13.pdf for watermarking - file_path = Path(__file__).parent / "static" / "Group_13.pdf" + file_path = Path(__file__).parent | "static" / "Group_13.pdf" file_path = file_path.resolve() if not file_path.exists():</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e4ec368e19e07fc73: unsupported operand type(s) for /: 'str' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 20.29s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1776"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1776_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1776_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1776_1"><button class="btn btn-outline-success"><span class="job_id">1776 : Job ID b9e06607b1fb4a9ba55b3d16109c857b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1776_1" data-parent="#job_list___sub_accordion_1776" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1776_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=163" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (163, 57), end pos: (163, 58)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitOr, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -160,7 +160,7 @@ # Resolve file path storage_root = Path(self.storage_dir).resolve() # Always use static/Group_13.pdf for watermarking - file_path = Path(__file__).parent / "static" / "Group_13.pdf" + file_path = Path(__file__).parent / "static" | "Group_13.pdf" file_path = file_path.resolve() if not file_path.exists():</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e85ebfbce7c444ac3: unsupported operand type(s) for |: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 20.86s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1777"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1777_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1777_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1777_1"><button class="btn btn-outline-success"><span class="job_id">1777 : Job ID b4b21f1773794fbabf4e1a943e044782</span></button></div></a><div aria-labelledby="job_list___sub_heading_1777_1" data-parent="#job_list___sub_accordion_1777" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1777_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=273" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (273, 36), end pos: (273, 37)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitOr, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -270,7 +270,7 @@ return jsonify({"error": "Watermarking produced no output"}), 500 # Create destination directory and file - rmap_dir = storage_root / "rmap_watermarks" + rmap_dir = storage_root | "rmap_watermarks" rmap_dir.mkdir(parents=True, exist_ok=True) dest_filename = f"rmap_{session_secret}.pdf"</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e608e339b3637da1b: unsupported operand type(s) for |: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 20.48s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1778"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1778_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1778_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1778_1"><button class="btn btn-outline-success"><span class="job_id">1778 : Job ID 9f34fda5c6614f64bea7e82d5729c641</span></button></div></a><div aria-labelledby="job_list___sub_heading_1778_1" data-parent="#job_list___sub_accordion_1778" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1778_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=277" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (277, 33), end pos: (277, 34)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitOr, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -274,7 +274,7 @@ rmap_dir.mkdir(parents=True, exist_ok=True) dest_filename = f"rmap_{session_secret}.pdf" - dest_path = rmap_dir / dest_filename + dest_path = rmap_dir | dest_filename # Write watermarked PDF with dest_path.open("wb") as f:</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e0237b826c9f5b0a8: unsupported operand type(s) for |: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 20.34s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1779"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1779_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1779_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1779_1"><button class="btn btn-outline-success"><span class="job_id">1779 : Job ID 78a2b51f90474f758e12fd4abc316830</span></button></div></a><div aria-labelledby="job_list___sub_heading_1779_1" data-parent="#job_list___sub_accordion_1779" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1779_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=48" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (48, 59), end pos: (48, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitAnd, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -45,7 +45,7 @@ def _initialize_rmap(self) -&gt; SimpleRMAP: """Initialize the RMAP instance with proper key paths.""" # Set up paths for keys - public_keys_dir = str(Path(__file__).parent.parent / "public-keys" / "pki") + public_keys_dir = str(Path(__file__).parent.parent &amp; "public-keys" / "pki") server_private_key = str(Path(__file__).parent / "server_priv.asc") return SimpleRMAP(</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFFFF [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T055647230288Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T055647578233Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 10 failed, 4 passed, 9 warnings in 14.20s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1780"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1780_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1780_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1780_1"><button class="btn btn-outline-success"><span class="job_id">1780 : Job ID 0b2cc1fffee94ccda2e59aca35034f74</span></button></div></a><div aria-labelledby="job_list___sub_heading_1780_1" data-parent="#job_list___sub_accordion_1780" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1780_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=48" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (48, 75), end pos: (48, 76)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitAnd, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -45,7 +45,7 @@ def _initialize_rmap(self) -&gt; SimpleRMAP: """Initialize the RMAP instance with proper key paths.""" # Set up paths for keys - public_keys_dir = str(Path(__file__).parent.parent / "public-keys" / "pki") + public_keys_dir = str(Path(__file__).parent.parent / "public-keys" &amp; "pki") server_private_key = str(Path(__file__).parent / "server_priv.asc") return SimpleRMAP(</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFFFF [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for &amp;: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for &amp;: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for &amp;: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T000653105923Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for &amp;: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for &amp;: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for &amp;: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for &amp;: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for &amp;: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for &amp;: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T000653377541Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for &amp;: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for &amp;: 'WindowsPath' and 'str' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for &amp;: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 12 failed, 2 passed, 9 warnings in 13.88s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1781"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1781_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1781_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1781_1"><button class="btn btn-outline-success"><span class="job_id">1781 : Job ID 0a4f0297209b41e49eee1276f58dedbe</span></button></div></a><div aria-labelledby="job_list___sub_heading_1781_1" data-parent="#job_list___sub_accordion_1781" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1781_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=49" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (49, 55), end pos: (49, 56)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitAnd, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -46,7 +46,7 @@ """Initialize the RMAP instance with proper key paths.""" # Set up paths for keys public_keys_dir = str(Path(__file__).parent.parent / "public-keys" / "pki") - server_private_key = str(Path(__file__).parent / "server_priv.asc") + server_private_key = str(Path(__file__).parent &amp; "server_priv.asc") return SimpleRMAP( self.storage_dir,</pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for &amp;: 'WindowsPath' and 'str' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for &amp;: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 14.91s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1782"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1782_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1782_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1782_1"><button class="btn btn-outline-success"><span class="job_id">1782 : Job ID 1bbb344c6b1a4acb834f090c03bfa91a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1782_1" data-parent="#job_list___sub_accordion_1782" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1782_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=163" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (163, 46), end pos: (163, 47)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitAnd, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -160,7 +160,7 @@ # Resolve file path storage_root = Path(self.storage_dir).resolve() # Always use static/Group_13.pdf for watermarking - file_path = Path(__file__).parent / "static" / "Group_13.pdf" + file_path = Path(__file__).parent &amp; "static" / "Group_13.pdf" file_path = file_path.resolve() if not file_path.exists():</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e029f3b2ac579c88f: unsupported operand type(s) for /: 'str' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 21.96s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1783"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1783_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1783_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1783_1"><button class="btn btn-outline-success"><span class="job_id">1783 : Job ID edb2fcc066b347d4928004bfdc387720</span></button></div></a><div aria-labelledby="job_list___sub_heading_1783_1" data-parent="#job_list___sub_accordion_1783" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1783_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=163" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (163, 57), end pos: (163, 58)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitAnd, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -160,7 +160,7 @@ # Resolve file path storage_root = Path(self.storage_dir).resolve() # Always use static/Group_13.pdf for watermarking - file_path = Path(__file__).parent / "static" / "Group_13.pdf" + file_path = Path(__file__).parent / "static" &amp; "Group_13.pdf" file_path = file_path.resolve() if not file_path.exists():</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e3d6cbfd88c5ae02e: unsupported operand type(s) for &amp;: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 20.85s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1784"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1784_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1784_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1784_1"><button class="btn btn-outline-success"><span class="job_id">1784 : Job ID a8725243c9ef486a9fc090476c97a28e</span></button></div></a><div aria-labelledby="job_list___sub_heading_1784_1" data-parent="#job_list___sub_accordion_1784" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1784_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=273" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (273, 36), end pos: (273, 37)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitAnd, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -270,7 +270,7 @@ return jsonify({"error": "Watermarking produced no output"}), 500 # Create destination directory and file - rmap_dir = storage_root / "rmap_watermarks" + rmap_dir = storage_root &amp; "rmap_watermarks" rmap_dir.mkdir(parents=True, exist_ok=True) dest_filename = f"rmap_{session_secret}.pdf"</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e2023d5a1314a1d4b: unsupported operand type(s) for &amp;: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.73s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1785"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1785_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1785_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1785_1"><button class="btn btn-outline-success"><span class="job_id">1785 : Job ID 5c142b4266d0469f80f21818f8baf00b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1785_1" data-parent="#job_list___sub_accordion_1785" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1785_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=277" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (277, 33), end pos: (277, 34)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitAnd, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -274,7 +274,7 @@ rmap_dir.mkdir(parents=True, exist_ok=True) dest_filename = f"rmap_{session_secret}.pdf" - dest_path = rmap_dir / dest_filename + dest_path = rmap_dir &amp; dest_filename # Write watermarked PDF with dest_path.open("wb") as f:</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e198b215e2e484db1: unsupported operand type(s) for &amp;: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 21.03s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1786"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1786_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1786_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1786_1"><button class="btn btn-outline-success"><span class="job_id">1786 : Job ID b2d3d9134081470fa28c00699c7bda2d</span></button></div></a><div aria-labelledby="job_list___sub_heading_1786_1" data-parent="#job_list___sub_accordion_1786" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1786_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=48" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (48, 59), end pos: (48, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitXor, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -45,7 +45,7 @@ def _initialize_rmap(self) -&gt; SimpleRMAP: """Initialize the RMAP instance with proper key paths.""" # Set up paths for keys - public_keys_dir = str(Path(__file__).parent.parent / "public-keys" / "pki") + public_keys_dir = str(Path(__file__).parent.parent ^ "public-keys" / "pki") server_private_key = str(Path(__file__).parent / "server_priv.asc") return SimpleRMAP(</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFFFF [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T025715573432Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T025715867477Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for /: 'str' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 12 failed, 2 passed, 9 warnings in 13.84s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1787"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1787_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1787_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1787_1"><button class="btn btn-outline-success"><span class="job_id">1787 : Job ID 365970f9b58a42859ff77a35292f89c5</span></button></div></a><div aria-labelledby="job_list___sub_heading_1787_1" data-parent="#job_list___sub_accordion_1787" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1787_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=48" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (48, 75), end pos: (48, 76)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitXor, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -45,7 +45,7 @@ def _initialize_rmap(self) -&gt; SimpleRMAP: """Initialize the RMAP instance with proper key paths.""" # Set up paths for keys - public_keys_dir = str(Path(__file__).parent.parent / "public-keys" / "pki") + public_keys_dir = str(Path(__file__).parent.parent / "public-keys" ^ "pki") server_private_key = str(Path(__file__).parent / "server_priv.asc") return SimpleRMAP(</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFFFF [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for ^: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for ^: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for ^: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T234413020472Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for ^: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for ^: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for ^: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for ^: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T234413373844Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for ^: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for ^: 'WindowsPath' and 'str' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for ^: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 10 failed, 4 passed, 9 warnings in 13.94s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1788"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1788_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1788_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1788_1"><button class="btn btn-outline-success"><span class="job_id">1788 : Job ID 81e46c1d71a44a688ae831d82ec579b0</span></button></div></a><div aria-labelledby="job_list___sub_heading_1788_1" data-parent="#job_list___sub_accordion_1788" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1788_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=49" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (49, 55), end pos: (49, 56)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitXor, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -46,7 +46,7 @@ """Initialize the RMAP instance with proper key paths.""" # Set up paths for keys public_keys_dir = str(Path(__file__).parent.parent / "public-keys" / "pki") - server_private_key = str(Path(__file__).parent / "server_priv.asc") + server_private_key = str(Path(__file__).parent ^ "server_priv.asc") return SimpleRMAP( self.storage_dir,</pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for ^: 'WindowsPath' and 'str' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for ^: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 15.00s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1789"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1789_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1789_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1789_1"><button class="btn btn-outline-success"><span class="job_id">1789 : Job ID 7094071e7d734279849a431071d29713</span></button></div></a><div aria-labelledby="job_list___sub_heading_1789_1" data-parent="#job_list___sub_accordion_1789" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1789_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=163" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (163, 46), end pos: (163, 47)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitXor, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -160,7 +160,7 @@ # Resolve file path storage_root = Path(self.storage_dir).resolve() # Always use static/Group_13.pdf for watermarking - file_path = Path(__file__).parent / "static" / "Group_13.pdf" + file_path = Path(__file__).parent ^ "static" / "Group_13.pdf" file_path = file_path.resolve() if not file_path.exists():</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614efc9e263c2a6c0973: unsupported operand type(s) for /: 'str' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 21.20s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1790"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1790_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1790_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1790_1"><button class="btn btn-outline-success"><span class="job_id">1790 : Job ID 70daad2af771432f9ea57f1c28427202</span></button></div></a><div aria-labelledby="job_list___sub_heading_1790_1" data-parent="#job_list___sub_accordion_1790" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1790_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=163" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (163, 57), end pos: (163, 58)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitXor, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -160,7 +160,7 @@ # Resolve file path storage_root = Path(self.storage_dir).resolve() # Always use static/Group_13.pdf for watermarking - file_path = Path(__file__).parent / "static" / "Group_13.pdf" + file_path = Path(__file__).parent / "static" ^ "Group_13.pdf" file_path = file_path.resolve() if not file_path.exists():</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T045806441403Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T045807424694Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e98063b3dcb984a95: unsupported operand type(s) for ^: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 9 failed, 5 passed, 22 warnings in 19.62s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1791"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1791_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1791_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1791_1"><button class="btn btn-outline-success"><span class="job_id">1791 : Job ID fab86db1766f4cec9e5fd19387b8f13a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1791_1" data-parent="#job_list___sub_accordion_1791" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1791_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=273" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (273, 36), end pos: (273, 37)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitXor, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -270,7 +270,7 @@ return jsonify({"error": "Watermarking produced no output"}), 500 # Create destination directory and file - rmap_dir = storage_root / "rmap_watermarks" + rmap_dir = storage_root ^ "rmap_watermarks" rmap_dir.mkdir(parents=True, exist_ok=True) dest_filename = f"rmap_{session_secret}.pdf"</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T191005382072Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T191006288795Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614eef18380299e5b657: unsupported operand type(s) for ^: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 9 failed, 5 passed, 22 warnings in 19.65s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1792"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1792_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1792_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1792_1"><button class="btn btn-outline-success"><span class="job_id">1792 : Job ID 9c0577da712c4b23997dc23612c38082</span></button></div></a><div aria-labelledby="job_list___sub_heading_1792_1" data-parent="#job_list___sub_accordion_1792" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1792_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=277" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (277, 33), end pos: (277, 34)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitXor, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -274,7 +274,7 @@ rmap_dir.mkdir(parents=True, exist_ok=True) dest_filename = f"rmap_{session_secret}.pdf" - dest_path = rmap_dir / dest_filename + dest_path = rmap_dir ^ dest_filename # Write watermarked PDF with dest_path.open("wb") as f:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T025011650303Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T025012494176Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e20c3e47c009a2da7: unsupported operand type(s) for ^: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 11 failed, 3 passed, 22 warnings in 19.16s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1793"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1793_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1793_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1793_1"><button class="btn btn-outline-success"><span class="job_id">1793 : Job ID a659e07432b44013ae23ffb553a2a0ab</span></button></div></a><div aria-labelledby="job_list___sub_heading_1793_1" data-parent="#job_list___sub_accordion_1793" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1793_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=112" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (112, 78), end pos: (112, 79)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -109,7 +109,7 @@ except Exception as e: return jsonify({"error": f"RMAP system error: {str(e)}"}), 503 - def _create_watermarked_pdf_for_session(self, session_secret: str) -&gt; Any | None: + def _create_watermarked_pdf_for_session(self, session_secret: str) -&gt; Any + None: """ Create a watermarked PDF for the RMAP session. </pre></div><div class="alert alert-secondary"><pre class="diff">...F........FF [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:228: in open request = self._request_from_builder_args(args, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:200: in _request_from_builder_args return builder.get_request() ^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:764: in get_request return cls(self.get_environ()) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:688: in get_environ input_stream, content_length, boundary = stream_encode_multipart( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:130: in stream_encode_multipart write_binary(encoder.send_event(Data(data=chunk, more_data=True))) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:81: in write_binary return stream.write(s) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 3 failed, 11 passed, 9 warnings in 15.26s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1794"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1794_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1794_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1794_1"><button class="btn btn-outline-success"><span class="job_id">1794 : Job ID be8b000aa36d41a8946c9800758edfa7</span></button></div></a><div aria-labelledby="job_list___sub_heading_1794_1" data-parent="#job_list___sub_accordion_1794" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1794_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=269" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (269, 46), end pos: (269, 47)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -266,7 +266,7 @@ position=None, ) - if not isinstance(wm_bytes, bytes | bytearray) or len(wm_bytes) == 0: + if not isinstance(wm_bytes, bytes + bytearray) or len(wm_bytes) == 0: return jsonify({"error": "Watermarking produced no output"}), 500 # Create destination directory and file</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T154932277540Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T154933131091Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614eb513cd0cbdfda684: unsupported operand type(s) for +: 'type' and 'type' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 10 failed, 4 passed, 22 warnings in 19.32s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1795"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1795_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1795_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1795_1"><button class="btn btn-outline-success"><span class="job_id">1795 : Job ID 910b00893af7454c9ddea9fc7d85ed43</span></button></div></a><div aria-labelledby="job_list___sub_heading_1795_1" data-parent="#job_list___sub_accordion_1795" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1795_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=112" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (112, 78), end pos: (112, 79)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -109,7 +109,7 @@ except Exception as e: return jsonify({"error": f"RMAP system error: {str(e)}"}), 503 - def _create_watermarked_pdf_for_session(self, session_secret: str) -&gt; Any | None: + def _create_watermarked_pdf_for_session(self, session_secret: str) -&gt; Any - None: """ Create a watermarked PDF for the RMAP session. </pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 15.31s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1796"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1796_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1796_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1796_1"><button class="btn btn-outline-success"><span class="job_id">1796 : Job ID 626701ae99cc427385bf6cb13c423934</span></button></div></a><div aria-labelledby="job_list___sub_heading_1796_1" data-parent="#job_list___sub_accordion_1796" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1796_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=269" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (269, 46), end pos: (269, 47)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -266,7 +266,7 @@ position=None, ) - if not isinstance(wm_bytes, bytes | bytearray) or len(wm_bytes) == 0: + if not isinstance(wm_bytes, bytes - bytearray) or len(wm_bytes) == 0: return jsonify({"error": "Watermarking produced no output"}), 500 # Create destination directory and file</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T051404474736Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T051405699137Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e8f1f6f8002466b40: unsupported operand type(s) for -: 'type' and 'type' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 9 failed, 5 passed, 22 warnings in 23.14s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1797"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1797_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1797_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1797_1"><button class="btn btn-outline-success"><span class="job_id">1797 : Job ID 42d0684c0b6f493a87a3859fd0f3551b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1797_1" data-parent="#job_list___sub_accordion_1797" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1797_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=112" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (112, 78), end pos: (112, 79)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -109,7 +109,7 @@ except Exception as e: return jsonify({"error": f"RMAP system error: {str(e)}"}), 503 - def _create_watermarked_pdf_for_session(self, session_secret: str) -&gt; Any | None: + def _create_watermarked_pdf_for_session(self, session_secret: str) -&gt; Any * None: """ Create a watermarked PDF for the RMAP session. </pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 14.97s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1798"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1798_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1798_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1798_1"><button class="btn btn-outline-success"><span class="job_id">1798 : Job ID e561e89fcfea4ffda9ea31b1da7d8266</span></button></div></a><div aria-labelledby="job_list___sub_heading_1798_1" data-parent="#job_list___sub_accordion_1798" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1798_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=269" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (269, 46), end pos: (269, 47)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -266,7 +266,7 @@ position=None, ) - if not isinstance(wm_bytes, bytes | bytearray) or len(wm_bytes) == 0: + if not isinstance(wm_bytes, bytes * bytearray) or len(wm_bytes) == 0: return jsonify({"error": "Watermarking produced no output"}), 500 # Create destination directory and file</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e323f9778b3becb97: unsupported operand type(s) for *: 'type' and 'type' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 20.66s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1799"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1799_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1799_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1799_1"><button class="btn btn-outline-success"><span class="job_id">1799 : Job ID 53bad53cd24f4917afb34820214bbc5d</span></button></div></a><div aria-labelledby="job_list___sub_heading_1799_1" data-parent="#job_list___sub_accordion_1799" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1799_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=112" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (112, 78), end pos: (112, 79)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -109,7 +109,7 @@ except Exception as e: return jsonify({"error": f"RMAP system error: {str(e)}"}), 503 - def _create_watermarked_pdf_for_session(self, session_secret: str) -&gt; Any | None: + def _create_watermarked_pdf_for_session(self, session_secret: str) -&gt; Any / None: """ Create a watermarked PDF for the RMAP session. </pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 14.96s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1800"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1800_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1800_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1800_1"><button class="btn btn-outline-success"><span class="job_id">1800 : Job ID bb81b1c38eb84c2986758d123c76e0b5</span></button></div></a><div aria-labelledby="job_list___sub_heading_1800_1" data-parent="#job_list___sub_accordion_1800" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1800_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=269" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (269, 46), end pos: (269, 47)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -266,7 +266,7 @@ position=None, ) - if not isinstance(wm_bytes, bytes | bytearray) or len(wm_bytes) == 0: + if not isinstance(wm_bytes, bytes / bytearray) or len(wm_bytes) == 0: return jsonify({"error": "Watermarking produced no output"}), 500 # Create destination directory and file</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T151251833534Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T151252819824Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e933026be1c17a5a9: unsupported operand type(s) for /: 'type' and 'type' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 9 failed, 5 passed, 22 warnings in 19.38s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1801"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1801_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1801_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1801_1"><button class="btn btn-outline-success"><span class="job_id">1801 : Job ID c8372b4d6ffb4e248054af28128d9f9c</span></button></div></a><div aria-labelledby="job_list___sub_heading_1801_1" data-parent="#job_list___sub_accordion_1801" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1801_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=112" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (112, 78), end pos: (112, 79)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -109,7 +109,7 @@ except Exception as e: return jsonify({"error": f"RMAP system error: {str(e)}"}), 503 - def _create_watermarked_pdf_for_session(self, session_secret: str) -&gt; Any | None: + def _create_watermarked_pdf_for_session(self, session_secret: str) -&gt; Any // None: """ Create a watermarked PDF for the RMAP session. </pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 17.04s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1802"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1802_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1802_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1802_1"><button class="btn btn-outline-success"><span class="job_id">1802 : Job ID 2eaf93d5cb964f11a1dc85b08d49e2a7</span></button></div></a><div aria-labelledby="job_list___sub_heading_1802_1" data-parent="#job_list___sub_accordion_1802" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1802_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=269" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (269, 46), end pos: (269, 47)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -266,7 +266,7 @@ position=None, ) - if not isinstance(wm_bytes, bytes | bytearray) or len(wm_bytes) == 0: + if not isinstance(wm_bytes, bytes // bytearray) or len(wm_bytes) == 0: return jsonify({"error": "Watermarking produced no output"}), 500 # Create destination directory and file</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%]</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1803"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1803_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1803_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1803_1"><button class="btn btn-outline-success"><span class="job_id">1803 : Job ID 692a6276124245be9968a3bee0a397b5</span></button></div></a><div aria-labelledby="job_list___sub_heading_1803_1" data-parent="#job_list___sub_accordion_1803" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1803_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=112" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (112, 78), end pos: (112, 79)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -109,7 +109,7 @@ except Exception as e: return jsonify({"error": f"RMAP system error: {str(e)}"}), 503 - def _create_watermarked_pdf_for_session(self, session_secret: str) -&gt; Any | None: + def _create_watermarked_pdf_for_session(self, session_secret: str) -&gt; Any % None: """ Create a watermarked PDF for the RMAP session. </pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 14.78s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1804"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1804_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1804_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1804_1"><button class="btn btn-outline-success"><span class="job_id">1804 : Job ID 08f07b31022f42daa31423eb665bc6cb</span></button></div></a><div aria-labelledby="job_list___sub_heading_1804_1" data-parent="#job_list___sub_accordion_1804" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1804_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=269" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (269, 46), end pos: (269, 47)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -266,7 +266,7 @@ position=None, ) - if not isinstance(wm_bytes, bytes | bytearray) or len(wm_bytes) == 0: + if not isinstance(wm_bytes, bytes % bytearray) or len(wm_bytes) == 0: return jsonify({"error": "Watermarking produced no output"}), 500 # Create destination directory and file</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e252e0298d0f8a4c1: unsupported operand type(s) for %: 'type' and 'type' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 20.36s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1805"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1805_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1805_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1805_1"><button class="btn btn-outline-success"><span class="job_id">1805 : Job ID ba821a3704e44f34a8279e6fccdfa197</span></button></div></a><div aria-labelledby="job_list___sub_heading_1805_1" data-parent="#job_list___sub_accordion_1805" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1805_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=112" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (112, 78), end pos: (112, 79)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -109,7 +109,7 @@ except Exception as e: return jsonify({"error": f"RMAP system error: {str(e)}"}), 503 - def _create_watermarked_pdf_for_session(self, session_secret: str) -&gt; Any | None: + def _create_watermarked_pdf_for_session(self, session_secret: str) -&gt; Any ** None: """ Create a watermarked PDF for the RMAP session. </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFFFF [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T182147932766Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T182148141367Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 12 failed, 2 passed, 9 warnings in 13.74s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1806"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1806_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1806_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1806_1"><button class="btn btn-outline-success"><span class="job_id">1806 : Job ID 632c3ffaa0f34730a06394d85968b68b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1806_1" data-parent="#job_list___sub_accordion_1806" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1806_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=269" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (269, 46), end pos: (269, 47)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -266,7 +266,7 @@ position=None, ) - if not isinstance(wm_bytes, bytes | bytearray) or len(wm_bytes) == 0: + if not isinstance(wm_bytes, bytes ** bytearray) or len(wm_bytes) == 0: return jsonify({"error": "Watermarking produced no output"}), 500 # Create destination directory and file</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e1941349003a76b92: unsupported operand type(s) for ** or pow(): 'type' and 'type' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 20.18s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1807"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1807_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1807_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1807_1"><button class="btn btn-outline-success"><span class="job_id">1807 : Job ID 46449ba756204fb8a6bdb76f0fc78b84</span></button></div></a><div aria-labelledby="job_list___sub_heading_1807_1" data-parent="#job_list___sub_accordion_1807" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1807_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=112" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (112, 78), end pos: (112, 79)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -109,7 +109,7 @@ except Exception as e: return jsonify({"error": f"RMAP system error: {str(e)}"}), 503 - def _create_watermarked_pdf_for_session(self, session_secret: str) -&gt; Any | None: + def _create_watermarked_pdf_for_session(self, session_secret: str) -&gt; Any &gt;&gt; None: """ Create a watermarked PDF for the RMAP session. </pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 14.95s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1808"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1808_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1808_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1808_1"><button class="btn btn-outline-success"><span class="job_id">1808 : Job ID f0b1e058e73a48d5bc96d53713202e43</span></button></div></a><div aria-labelledby="job_list___sub_heading_1808_1" data-parent="#job_list___sub_accordion_1808" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1808_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=269" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (269, 46), end pos: (269, 47)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -266,7 +266,7 @@ position=None, ) - if not isinstance(wm_bytes, bytes | bytearray) or len(wm_bytes) == 0: + if not isinstance(wm_bytes, bytes &gt;&gt; bytearray) or len(wm_bytes) == 0: return jsonify({"error": "Watermarking produced no output"}), 500 # Create destination directory and file</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T203223099041Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T203224036270Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e36aca29000279da9: unsupported operand type(s) for &gt;&gt;: 'type' and 'type' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 10 failed, 4 passed, 22 warnings in 19.65s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1809"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1809_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1809_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1809_1"><button class="btn btn-outline-success"><span class="job_id">1809 : Job ID 09f981dcae5749948515bf04448a64a3</span></button></div></a><div aria-labelledby="job_list___sub_heading_1809_1" data-parent="#job_list___sub_accordion_1809" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1809_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=112" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (112, 78), end pos: (112, 79)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -109,7 +109,7 @@ except Exception as e: return jsonify({"error": f"RMAP system error: {str(e)}"}), 503 - def _create_watermarked_pdf_for_session(self, session_secret: str) -&gt; Any | None: + def _create_watermarked_pdf_for_session(self, session_secret: str) -&gt; Any &lt;&lt; None: """ Create a watermarked PDF for the RMAP session. </pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFFFF [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T170842927148Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T170843276900Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 10 failed, 4 passed, 9 warnings in 13.91s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1810"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1810_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1810_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1810_1"><button class="btn btn-outline-success"><span class="job_id">1810 : Job ID ea1f9b3b4789410baeebf6eaf58bee7f</span></button></div></a><div aria-labelledby="job_list___sub_heading_1810_1" data-parent="#job_list___sub_accordion_1810" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1810_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=269" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (269, 46), end pos: (269, 47)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -266,7 +266,7 @@ position=None, ) - if not isinstance(wm_bytes, bytes | bytearray) or len(wm_bytes) == 0: + if not isinstance(wm_bytes, bytes &lt;&lt; bytearray) or len(wm_bytes) == 0: return jsonify({"error": "Watermarking produced no output"}), 500 # Create destination directory and file</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ebcf0c660164da1c3: unsupported operand type(s) for &lt;&lt;: 'type' and 'type' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 20.35s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1811"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1811_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1811_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1811_1"><button class="btn btn-outline-success"><span class="job_id">1811 : Job ID d9d88e940bd240118fe4111868a37283</span></button></div></a><div aria-labelledby="job_list___sub_heading_1811_1" data-parent="#job_list___sub_accordion_1811" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1811_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=112" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (112, 78), end pos: (112, 79)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -109,7 +109,7 @@ except Exception as e: return jsonify({"error": f"RMAP system error: {str(e)}"}), 503 - def _create_watermarked_pdf_for_session(self, session_secret: str) -&gt; Any | None: + def _create_watermarked_pdf_for_session(self, session_secret: str) -&gt; Any &amp; None: """ Create a watermarked PDF for the RMAP session. </pre></div><div class="alert alert-secondary"><pre class="diff">...F........FF [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:228: in open request = self._request_from_builder_args(args, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:200: in _request_from_builder_args return builder.get_request() ^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:764: in get_request return cls(self.get_environ()) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:688: in get_environ input_stream, content_length, boundary = stream_encode_multipart( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:130: in stream_encode_multipart write_binary(encoder.send_event(Data(data=chunk, more_data=True))) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:81: in write_binary return stream.write(s) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 3 failed, 11 passed, 9 warnings in 14.76s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1812"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1812_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1812_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1812_1"><button class="btn btn-outline-success"><span class="job_id">1812 : Job ID 22c36d12c10140b4b44e8e5dfa310214</span></button></div></a><div aria-labelledby="job_list___sub_heading_1812_1" data-parent="#job_list___sub_accordion_1812" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1812_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=269" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (269, 46), end pos: (269, 47)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -266,7 +266,7 @@ position=None, ) - if not isinstance(wm_bytes, bytes | bytearray) or len(wm_bytes) == 0: + if not isinstance(wm_bytes, bytes &amp; bytearray) or len(wm_bytes) == 0: return jsonify({"error": "Watermarking produced no output"}), 500 # Create destination directory and file</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e84b0da4590f5c5e3: unsupported operand type(s) for &amp;: 'type' and 'type' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 20.71s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1813"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1813_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1813_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1813_1"><button class="btn btn-outline-success"><span class="job_id">1813 : Job ID 2938850f5b044348b30aab418fa7e557</span></button></div></a><div aria-labelledby="job_list___sub_heading_1813_1" data-parent="#job_list___sub_accordion_1813" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1813_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=112" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (112, 78), end pos: (112, 79)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -109,7 +109,7 @@ except Exception as e: return jsonify({"error": f"RMAP system error: {str(e)}"}), 503 - def _create_watermarked_pdf_for_session(self, session_secret: str) -&gt; Any | None: + def _create_watermarked_pdf_for_session(self, session_secret: str) -&gt; Any ^ None: """ Create a watermarked PDF for the RMAP session. </pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 14.93s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1814"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1814_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1814_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1814_1"><button class="btn btn-outline-success"><span class="job_id">1814 : Job ID e22eaa5fee6b42d580e093fa2015a362</span></button></div></a><div aria-labelledby="job_list___sub_heading_1814_1" data-parent="#job_list___sub_accordion_1814" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1814_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=269" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (269, 46), end pos: (269, 47)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -266,7 +266,7 @@ position=None, ) - if not isinstance(wm_bytes, bytes | bytearray) or len(wm_bytes) == 0: + if not isinstance(wm_bytes, bytes ^ bytearray) or len(wm_bytes) == 0: return jsonify({"error": "Watermarking produced no output"}), 500 # Create destination directory and file</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e7fb9464699fffaba: unsupported operand type(s) for ^: 'type' and 'type' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 20.29s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1815"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1815_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1815_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1815_1"><button class="btn btn-outline-success"><span class="job_id">1815 : Job ID 13eb037b3c294f429fe581f7febe4563</span></button></div></a><div aria-labelledby="job_list___sub_heading_1815_1" data-parent="#job_list___sub_accordion_1815" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1815_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=269" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (269, 76), end pos: (269, 78)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_NotEq, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -266,7 +266,7 @@ position=None, ) - if not isinstance(wm_bytes, bytes | bytearray) or len(wm_bytes) == 0: + if not isinstance(wm_bytes, bytes | bytearray) or len(wm_bytes) != 0: return jsonify({"error": "Watermarking produced no output"}), 500 # Create destination directory and file</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 20.39s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1816"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1816_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1816_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1816_1"><button class="btn btn-outline-danger"><span class="job_id">1816 : Job ID b13df29e879349fdac8c44e6df50e969</span></button></div></a><div aria-labelledby="job_list___sub_heading_1816_1" data-parent="#job_list___sub_accordion_1816" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1816_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=290" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (290, 60), end pos: (290, 62)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_NotEq, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -287,7 +287,7 @@ intended_for = self.rmap_instance.get_session_identity( session_secret ) - if intended_for is None or intended_for == "Unknown_Group": + if intended_for is None or intended_for != "Unknown_Group": # Use a more descriptive fallback that # indicates RMAP authentication intended_for = "RMAP_CLIENT"</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.01s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1817"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1817_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1817_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1817_1"><button class="btn btn-outline-danger"><span class="job_id">1817 : Job ID 5c57eaa97f4d48fea39e2208de24b68c</span></button></div></a><div aria-labelledby="job_list___sub_heading_1817_1" data-parent="#job_list___sub_accordion_1817" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1817_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=269" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (269, 76), end pos: (269, 78)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_Lt, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -266,7 +266,7 @@ position=None, ) - if not isinstance(wm_bytes, bytes | bytearray) or len(wm_bytes) == 0: + if not isinstance(wm_bytes, bytes | bytearray) or len(wm_bytes) &lt; 0: return jsonify({"error": "Watermarking produced no output"}), 500 # Create destination directory and file</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.12s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1818"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1818_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1818_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1818_1"><button class="btn btn-outline-danger"><span class="job_id">1818 : Job ID c1c4679369734bd485396a21f95f1883</span></button></div></a><div aria-labelledby="job_list___sub_heading_1818_1" data-parent="#job_list___sub_accordion_1818" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1818_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=290" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (290, 60), end pos: (290, 62)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_Lt, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -287,7 +287,7 @@ intended_for = self.rmap_instance.get_session_identity( session_secret ) - if intended_for is None or intended_for == "Unknown_Group": + if intended_for is None or intended_for &lt; "Unknown_Group": # Use a more descriptive fallback that # indicates RMAP authentication intended_for = "RMAP_CLIENT"</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.06s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1819"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1819_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1819_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1819_1"><button class="btn btn-outline-danger"><span class="job_id">1819 : Job ID 2541bea3856d459ba656078e8aad161d</span></button></div></a><div aria-labelledby="job_list___sub_heading_1819_1" data-parent="#job_list___sub_accordion_1819" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1819_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=269" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (269, 76), end pos: (269, 78)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_LtE, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -266,7 +266,7 @@ position=None, ) - if not isinstance(wm_bytes, bytes | bytearray) or len(wm_bytes) == 0: + if not isinstance(wm_bytes, bytes | bytearray) or len(wm_bytes) &lt;= 0: return jsonify({"error": "Watermarking produced no output"}), 500 # Create destination directory and file</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.30s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1820"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1820_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1820_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1820_1"><button class="btn btn-outline-success"><span class="job_id">1820 : Job ID 969174944638487aa5bda5186da19454</span></button></div></a><div aria-labelledby="job_list___sub_heading_1820_1" data-parent="#job_list___sub_accordion_1820" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1820_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=290" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (290, 60), end pos: (290, 62)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_LtE, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -287,7 +287,7 @@ intended_for = self.rmap_instance.get_session_identity( session_secret ) - if intended_for is None or intended_for == "Unknown_Group": + if intended_for is None or intended_for &lt;= "Unknown_Group": # Use a more descriptive fallback that # indicates RMAP authentication intended_for = "RMAP_CLIENT"</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T192416274464Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T192417141196Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.81s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1821"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1821_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1821_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1821_1"><button class="btn btn-outline-success"><span class="job_id">1821 : Job ID 1542384ea88542759f4b0bfea1672269</span></button></div></a><div aria-labelledby="job_list___sub_heading_1821_1" data-parent="#job_list___sub_accordion_1821" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1821_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=269" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (269, 76), end pos: (269, 78)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_Gt, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -266,7 +266,7 @@ position=None, ) - if not isinstance(wm_bytes, bytes | bytearray) or len(wm_bytes) == 0: + if not isinstance(wm_bytes, bytes | bytearray) or len(wm_bytes) &gt; 0: return jsonify({"error": "Watermarking produced no output"}), 500 # Create destination directory and file</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 20.23s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1822"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1822_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1822_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1822_1"><button class="btn btn-outline-danger"><span class="job_id">1822 : Job ID 7abbf26893674f5b8ff54146e92898b8</span></button></div></a><div aria-labelledby="job_list___sub_heading_1822_1" data-parent="#job_list___sub_accordion_1822" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1822_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=290" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (290, 60), end pos: (290, 62)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_Gt, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -287,7 +287,7 @@ intended_for = self.rmap_instance.get_session_identity( session_secret ) - if intended_for is None or intended_for == "Unknown_Group": + if intended_for is None or intended_for &gt; "Unknown_Group": # Use a more descriptive fallback that # indicates RMAP authentication intended_for = "RMAP_CLIENT"</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.42s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1823"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1823_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1823_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1823_1"><button class="btn btn-outline-success"><span class="job_id">1823 : Job ID e8e37e75f3914a8a9f7681d11a588d61</span></button></div></a><div aria-labelledby="job_list___sub_heading_1823_1" data-parent="#job_list___sub_accordion_1823" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1823_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=269" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (269, 76), end pos: (269, 78)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_GtE, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -266,7 +266,7 @@ position=None, ) - if not isinstance(wm_bytes, bytes | bytearray) or len(wm_bytes) == 0: + if not isinstance(wm_bytes, bytes | bytearray) or len(wm_bytes) &gt;= 0: return jsonify({"error": "Watermarking produced no output"}), 500 # Create destination directory and file</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 20.32s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1824"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1824_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1824_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1824_1"><button class="btn btn-outline-success"><span class="job_id">1824 : Job ID ce71b64e8df24b9db085e0f464d437bf</span></button></div></a><div aria-labelledby="job_list___sub_heading_1824_1" data-parent="#job_list___sub_accordion_1824" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1824_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=290" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (290, 60), end pos: (290, 62)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_GtE, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -287,7 +287,7 @@ intended_for = self.rmap_instance.get_session_identity( session_secret ) - if intended_for is None or intended_for == "Unknown_Group": + if intended_for is None or intended_for &gt;= "Unknown_Group": # Use a more descriptive fallback that # indicates RMAP authentication intended_for = "RMAP_CLIENT"</pre></div><div class="alert alert-secondary"><pre class="diff">...F.......... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:228: in open request = self._request_from_builder_args(args, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:200: in _request_from_builder_args return builder.get_request() ^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:764: in get_request return cls(self.get_environ()) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:688: in get_environ input_stream, content_length, boundary = stream_encode_multipart( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:130: in stream_encode_multipart write_binary(encoder.send_event(Data(data=chunk, more_data=True))) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:81: in write_binary return stream.write(s) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... 1 failed, 13 passed, 22 warnings in 20.05s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1825"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1825_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1825_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1825_1"><button class="btn btn-outline-danger"><span class="job_id">1825 : Job ID b7d3a2c7e0e24c1da2dceed7134867a6</span></button></div></a><div aria-labelledby="job_list___sub_heading_1825_1" data-parent="#job_list___sub_accordion_1825" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1825_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=290" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (290, 60), end pos: (290, 62)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_Is, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -287,7 +287,7 @@ intended_for = self.rmap_instance.get_session_identity( session_secret ) - if intended_for is None or intended_for == "Unknown_Group": + if intended_for is None or intended_for is "Unknown_Group": # Use a more descriptive fallback that # indicates RMAP authentication intended_for = "RMAP_CLIENT"</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( rmap_handler.py:290 C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\rmap_handler.py:290: SyntaxWarning: "is" with 'str' literal. Did you mean "=="? if intended_for is None or intended_for is "Unknown_Group": ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 23 warnings in 20.14s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1826"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1826_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1826_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1826_1"><button class="btn btn-outline-danger"><span class="job_id">1826 : Job ID 9f15f1dbf4e843f580a3ea1949790f60</span></button></div></a><div aria-labelledby="job_list___sub_heading_1826_1" data-parent="#job_list___sub_accordion_1826" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1826_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=290" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (290, 60), end pos: (290, 62)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_IsNot, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -287,7 +287,7 @@ intended_for = self.rmap_instance.get_session_identity( session_secret ) - if intended_for is None or intended_for == "Unknown_Group": + if intended_for is None or intended_for is not "Unknown_Group": # Use a more descriptive fallback that # indicates RMAP authentication intended_for = "RMAP_CLIENT"</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( rmap_handler.py:290 C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\rmap_handler.py:290: SyntaxWarning: "is not" with 'str' literal. Did you mean "!="? if intended_for is None or intended_for is not "Unknown_Group": ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 23 warnings in 21.32s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1827"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1827_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1827_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1827_1"><button class="btn btn-outline-danger"><span class="job_id">1827 : Job ID 83be45c633b44b999fa6503b28cc5b70</span></button></div></a><div aria-labelledby="job_list___sub_heading_1827_1" data-parent="#job_list___sub_accordion_1827" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1827_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=290" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (290, 36), end pos: (290, 38)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Is_IsNot, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -287,7 +287,7 @@ intended_for = self.rmap_instance.get_session_identity( session_secret ) - if intended_for is None or intended_for == "Unknown_Group": + if intended_for is not None or intended_for == "Unknown_Group": # Use a more descriptive fallback that # indicates RMAP authentication intended_for = "RMAP_CLIENT"</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.18s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1828"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1828_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1828_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1828_1"><button class="btn btn-outline-success"><span class="job_id">1828 : Job ID 783e89a60e97409a88e2129137f2a135</span></button></div></a><div aria-labelledby="job_list___sub_heading_1828_1" data-parent="#job_list___sub_accordion_1828" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1828_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=304" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (304, 35), end pos: (304, 37)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Is_IsNot, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -301,7 +301,7 @@ ), {"path": str(file_path)}, ).first() - if file_record is None: + if file_record is not None: return jsonify({"error": "File record not found"}), 500 did = file_record.id </pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 20.90s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1829"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1829_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1829_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1829_1"><button class="btn btn-outline-success"><span class="job_id">1829 : Job ID c45ba334cc944226996fae0ff49a4417</span></button></div></a><div aria-labelledby="job_list___sub_heading_1829_1" data-parent="#job_list___sub_accordion_1829" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1829_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=104" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (104, 30), end pos: (104, 36)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_IsNot_Is, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -101,7 +101,7 @@ # Try to create watermarked PDF pdf_result = self._create_watermarked_pdf_for_session(session_secret) - if pdf_result is not None: + if pdf_result is None: return pdf_result # Return error response if PDF creation failed return jsonify(result), 200</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) &gt; response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:570: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:920: in full_dispatch_request return self.finalize_request(rv) ^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:939: in finalize_request response = self.make_response(rv) ^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = &lt;Flask 'server'&gt;, rv = None def make_response(self, rv: ft.ResponseReturnValue) -&gt; Response: """Convert the return value from a view function to an instance of :attr:`response_class`. :param rv: the return value from the view function. The view function must return a response. Returning ``None``, or the view ending without returning, is not allowed. The following types are allowed for ``view_rv``: ``str`` A response object is created with the string encoded to UTF-8 as the body. ``bytes`` A response object is created with the bytes as the body. ``dict`` A dictionary that will be jsonify'd before being returned. ``list`` A list that will be jsonify'd before being returned. ``generator`` or ``iterator`` A generator that returns ``str`` or ``bytes`` to be streamed as the response. ``tuple`` Either ``(body, status, headers)``, ``(body, status)``, or ``(body, headers)``, where ``body`` is any of the other types allowed here, ``status`` is a string or an integer, and ``headers`` is a dictionary or a list of ``(key, value)`` tuples. If ``body`` is a :attr:`response_class` instance, ``status`` overwrites the exiting value and ``headers`` are extended. :attr:`response_class` The object is returned unchanged. other :class:`~werkzeug.wrappers.Response` class The object is coerced to :attr:`response_class`. :func:`callable` The function is called as a WSGI application. The result is used to create a response object. .. versionchanged:: 2.2 A generator will be converted to a streaming response. A list will be converted to a JSON response. .. versionchanged:: 1.1 A dict will be converted to a JSON response. .. versionchanged:: 0.9 Previously a tuple was interpreted as the arguments for the response object. """ status: int | None = None headers: HeadersValue | None = None # unpack tuple returns if isinstance(rv, tuple): len_rv = len(rv) # a 3-tuple is unpacked directly if len_rv == 3: rv, status, headers = rv # type: ignore[misc] # decide if a 2-tuple has status or headers elif len_rv == 2: if isinstance(rv[1], (Headers, dict, tuple, list)): rv, headers = rv # pyright: ignore else: rv, status = rv # type: ignore[assignment,misc] # other sized tuples are not allowed else: raise TypeError( "The view function did not return a valid response tuple." " The tuple must have the form (body, status, headers)," " (body, status), or (body, headers)." ) # the body must not be None if rv is None: &gt; raise TypeError( f"The view function for {request.endpoint!r} did not" " return a valid response. The function either returned" " None or ended without a return statement." ) E TypeError: The view function for 'rmap_get_link' did not return a valid response. The function either returned None or ended without a return statement. C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1212: TypeError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - TypeError: The view function... 1 failed, 13 passed, 22 warnings in 20.64s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1830"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1830_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1830_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1830_1"><button class="btn btn-outline-success"><span class="job_id">1830 : Job ID 5aec1b76ac954d8a83e2020aa648075d</span></button></div></a><div aria-labelledby="job_list___sub_heading_1830_1" data-parent="#job_list___sub_accordion_1830" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1830_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=166" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (166, 15), end pos: (166, 18)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -163,7 +163,7 @@ file_path = Path(__file__).parent / "static" / "Group_13.pdf" file_path = file_path.resolve() - if not file_path.exists(): + if file_path.exists(): self.app.logger.error(f"Source PDF not found: {file_path}") return jsonify({"error": "Source PDF not found"}), 500 </pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:167 Source PDF not found: C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\static\Group_13.pdf ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 20.23s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1831"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1831_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1831_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1831_1"><button class="btn btn-outline-success"><span class="job_id">1831 : Job ID 59574f31edda4ec6ad249173c8b395fc</span></button></div></a><div aria-labelledby="job_list___sub_heading_1831_1" data-parent="#job_list___sub_accordion_1831" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1831_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=182" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (182, 23), end pos: (182, 26)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -179,7 +179,7 @@ {"path": str(file_path)}, ).first() - if not existing_file: + if existing_file: # Need to insert a full Documents row following schema: # (name, path, ownerid, sha256, size) # We don't have an authenticated user in RMAP flow, so we</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 20.77s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1832"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1832_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1832_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1832_1"><button class="btn btn-outline-success"><span class="job_id">1832 : Job ID d8fb64f60a334252b88718cb30fbafb8</span></button></div></a><div aria-labelledby="job_list___sub_heading_1832_1" data-parent="#job_list___sub_accordion_1832" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1832_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=191" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (191, 27), end pos: (191, 30)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -188,7 +188,7 @@ owner_row = conn.execute( text("SELECT id FROM Users WHERE email = 'service@rmap.su'") ).first() - if not owner_row: + if owner_row: raise RuntimeError( "No users exist to own RMAP base document; " "create a user first"</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:245 Failed to add source PDF to database: No users exist to own RMAP base document; create a user first ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 20.34s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1833"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1833_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1833_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1833_1"><button class="btn btn-outline-success"><span class="job_id">1833 : Job ID c6c5bae61f594964a9285129b7ce1a5a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1833_1" data-parent="#job_list___sub_accordion_1833" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1833_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=240" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (240, 35), end pos: (240, 38)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -237,7 +237,7 @@ ), {"path": str(file_path)}, ).first() - if not existing_file: + if existing_file: raise race_e except Exception: raise</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e035d0f19cc6f2c16: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.82s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1834"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1834_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1834_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1834_1"><button class="btn btn-outline-success"><span class="job_id">1834 : Job ID 6c3082a762f1466b895b36e967e93c8b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1834_1" data-parent="#job_list___sub_accordion_1834" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1834_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=257" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (257, 15), end pos: (257, 18)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -254,7 +254,7 @@ applicable = WMUtils.is_watermarking_applicable( method=method, pdf=str(file_path), position=None ) - if not applicable: + if applicable: return jsonify({"error": "Watermarking not applicable to PDF"}), 500 # Apply watermark</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 20.43s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1835"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1835_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1835_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1835_1"><button class="btn btn-outline-success"><span class="job_id">1835 : Job ID b299e4e67e67406ea3e013535b5c6cc6</span></button></div></a><div aria-labelledby="job_list___sub_heading_1835_1" data-parent="#job_list___sub_accordion_1835" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1835_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=269" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (269, 15), end pos: (269, 18)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -266,7 +266,7 @@ position=None, ) - if not isinstance(wm_bytes, bytes | bytearray) or len(wm_bytes) == 0: + if isinstance(wm_bytes, bytes | bytearray) or len(wm_bytes) == 0: return jsonify({"error": "Watermarking produced no output"}), 500 # Create destination directory and file</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 20.33s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1836"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1836_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1836_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1836_1"><button class="btn btn-outline-success"><span class="job_id">1836 : Job ID 52d9c4008aa4434cae78976b1efdbf51</span></button></div></a><div aria-labelledby="job_list___sub_heading_1836_1" data-parent="#job_list___sub_accordion_1836" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1836_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=79" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (79, 15), end pos: (79, 32)</button></a></pre><pre>operator: core/AddNot, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -76,7 +76,7 @@ payload = request.get_json(silent=True) or {} result = self.rmap_instance.handle_message1(payload) - if "error" in result: + if not "error" in result: return jsonify(result), 400 if "required" in result["error"] else 503 return jsonify(result), 200</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFFFF [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T042757568628Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T042758517698Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 503 == 200 10 failed, 4 passed, 22 warnings in 18.59s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1837"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1837_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1837_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1837_1"><button class="btn btn-outline-success"><span class="job_id">1837 : Job ID e7124e8f76ff463eb9070a53f333df56</span></button></div></a><div aria-labelledby="job_list___sub_heading_1837_1" data-parent="#job_list___sub_accordion_1837" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1837_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=80" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (80, 47), end pos: (80, 76)</button></a></pre><pre>operator: core/AddNot, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -77,7 +77,7 @@ result = self.rmap_instance.handle_message1(payload) if "error" in result: - return jsonify(result), 400 if "required" in result["error"] else 503 + return jsonify(result), 400 if not "required" in result["error"] else 503 return jsonify(result), 200 </pre></div><div class="alert alert-secondary"><pre class="diff">............F. [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt and inspect response payload decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) assert decrypted["nonceClient"] == test_nonce assert isinstance(decrypted["nonceServer"], int) # Test with wrong parameters # Missing params response = client.post("/api/rmap-initiate") &gt; assert response.status_code == 400 E assert 503 == 400 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:529: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 503 == 400 1 failed, 13 passed, 22 warnings in 20.23s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1838"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1838_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1838_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1838_1"><button class="btn btn-outline-success"><span class="job_id">1838 : Job ID 94ede07191b7422db80d8c57ca83be80</span></button></div></a><div aria-labelledby="job_list___sub_heading_1838_1" data-parent="#job_list___sub_accordion_1838" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1838_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=95" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (95, 15), end pos: (95, 32)</button></a></pre><pre>operator: core/AddNot, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -92,7 +92,7 @@ payload = request.get_json(silent=True) or {} result = self.rmap_instance.handle_message2(payload) - if "error" in result: + if not "error" in result: return jsonify(result), 400 if "required" in result["error"] else 503 # If RMAP authentication succeeded, create watermarked PDF</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:571: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 503 == 200 1 failed, 13 passed, 22 warnings in 21.60s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1839"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1839_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1839_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1839_1"><button class="btn btn-outline-success"><span class="job_id">1839 : Job ID b4635f0595cc4126a05e0c95873e13c7</span></button></div></a><div aria-labelledby="job_list___sub_heading_1839_1" data-parent="#job_list___sub_accordion_1839" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1839_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=96" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (96, 47), end pos: (96, 76)</button></a></pre><pre>operator: core/AddNot, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -93,7 +93,7 @@ result = self.rmap_instance.handle_message2(payload) if "error" in result: - return jsonify(result), 400 if "required" in result["error"] else 503 + return jsonify(result), 400 if not "required" in result["error"] else 503 # If RMAP authentication succeeded, create watermarked PDF if "result" in result:</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "result" in json_data assert isinstance(json_data["result"], str) assert len(json_data["result"]) == 32 # Test with wrong parameters # Missing params response = client.post("/api/rmap-get-link") &gt; assert response.status_code == 400 E assert 503 == 400 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:581: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 503 == 400 1 failed, 13 passed, 22 warnings in 20.91s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1840"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1840_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1840_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1840_1"><button class="btn btn-outline-success"><span class="job_id">1840 : Job ID 831c378966f64d308346fbf1c26bc577</span></button></div></a><div aria-labelledby="job_list___sub_heading_1840_1" data-parent="#job_list___sub_accordion_1840" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1840_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=99" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (99, 15), end pos: (99, 33)</button></a></pre><pre>operator: core/AddNot, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -96,7 +96,7 @@ return jsonify(result), 400 if "required" in result["error"] else 503 # If RMAP authentication succeeded, create watermarked PDF - if "result" in result: + if not "result" in result: session_secret = result["result"] # Try to create watermarked PDF</pre></div><div class="alert alert-secondary"><pre class="diff">...F.......... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:228: in open request = self._request_from_builder_args(args, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:200: in _request_from_builder_args return builder.get_request() ^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:764: in get_request return cls(self.get_environ()) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:688: in get_environ input_stream, content_length, boundary = stream_encode_multipart( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:130: in stream_encode_multipart write_binary(encoder.send_event(Data(data=chunk, more_data=True))) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:81: in write_binary return stream.write(s) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... 1 failed, 13 passed, 22 warnings in 19.99s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1841"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1841_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1841_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1841_1"><button class="btn btn-outline-success"><span class="job_id">1841 : Job ID a94e30a4a1ac48808878a922e159dbc9</span></button></div></a><div aria-labelledby="job_list___sub_heading_1841_1" data-parent="#job_list___sub_accordion_1841" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1841_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=104" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (104, 19), end pos: (104, 41)</button></a></pre><pre>operator: core/AddNot, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -101,7 +101,7 @@ # Try to create watermarked PDF pdf_result = self._create_watermarked_pdf_for_session(session_secret) - if pdf_result is not None: + if not pdf_result is not None: return pdf_result # Return error response if PDF creation failed return jsonify(result), 200</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) &gt; response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:570: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:920: in full_dispatch_request return self.finalize_request(rv) ^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:939: in finalize_request response = self.make_response(rv) ^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = &lt;Flask 'server'&gt;, rv = None def make_response(self, rv: ft.ResponseReturnValue) -&gt; Response: """Convert the return value from a view function to an instance of :attr:`response_class`. :param rv: the return value from the view function. The view function must return a response. Returning ``None``, or the view ending without returning, is not allowed. The following types are allowed for ``view_rv``: ``str`` A response object is created with the string encoded to UTF-8 as the body. ``bytes`` A response object is created with the bytes as the body. ``dict`` A dictionary that will be jsonify'd before being returned. ``list`` A list that will be jsonify'd before being returned. ``generator`` or ``iterator`` A generator that returns ``str`` or ``bytes`` to be streamed as the response. ``tuple`` Either ``(body, status, headers)``, ``(body, status)``, or ``(body, headers)``, where ``body`` is any of the other types allowed here, ``status`` is a string or an integer, and ``headers`` is a dictionary or a list of ``(key, value)`` tuples. If ``body`` is a :attr:`response_class` instance, ``status`` overwrites the exiting value and ``headers`` are extended. :attr:`response_class` The object is returned unchanged. other :class:`~werkzeug.wrappers.Response` class The object is coerced to :attr:`response_class`. :func:`callable` The function is called as a WSGI application. The result is used to create a response object. .. versionchanged:: 2.2 A generator will be converted to a streaming response. A list will be converted to a JSON response. .. versionchanged:: 1.1 A dict will be converted to a JSON response. .. versionchanged:: 0.9 Previously a tuple was interpreted as the arguments for the response object. """ status: int | None = None headers: HeadersValue | None = None # unpack tuple returns if isinstance(rv, tuple): len_rv = len(rv) # a 3-tuple is unpacked directly if len_rv == 3: rv, status, headers = rv # type: ignore[misc] # decide if a 2-tuple has status or headers elif len_rv == 2: if isinstance(rv[1], (Headers, dict, tuple, list)): rv, headers = rv # pyright: ignore else: rv, status = rv # type: ignore[assignment,misc] # other sized tuples are not allowed else: raise TypeError( "The view function did not return a valid response tuple." " The tuple must have the form (body, status, headers)," " (body, status), or (body, headers)." ) # the body must not be None if rv is None: &gt; raise TypeError( f"The view function for {request.endpoint!r} did not" " return a valid response. The function either returned" " None or ended without a return statement." ) E TypeError: The view function for 'rmap_get_link' did not return a valid response. The function either returned None or ended without a return statement. C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1212: TypeError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - TypeError: The view function... 1 failed, 13 passed, 22 warnings in 21.88s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1842"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1842_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1842_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1842_1"><button class="btn btn-outline-success"><span class="job_id">1842 : Job ID 3489bbbd479f4ecd9bc4b2650ceca993</span></button></div></a><div aria-labelledby="job_list___sub_heading_1842_1" data-parent="#job_list___sub_accordion_1842" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1842_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=135" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (135, 19), end pos: (135, 35)</button></a></pre><pre>operator: core/AddNot, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -132,7 +132,7 @@ {"link": session_secret}, ).first() - if existing_version: + if not existing_version: # Check if the file actually exists on disk existing_path = Path(existing_version.path) if existing_path.exists():</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 20.39s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1843"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1843_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1843_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1843_1"><button class="btn btn-outline-success"><span class="job_id">1843 : Job ID 8e211991518f482eae649d48041ffc3d</span></button></div></a><div aria-labelledby="job_list___sub_heading_1843_1" data-parent="#job_list___sub_accordion_1843" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1843_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=138" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (138, 23), end pos: (138, 45)</button></a></pre><pre>operator: core/AddNot, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -135,7 +135,7 @@ if existing_version: # Check if the file actually exists on disk existing_path = Path(existing_version.path) - if existing_path.exists(): + if not existing_path.exists(): self.app.logger.info( f"RMAP watermarked PDF already exists: {session_secret}" )</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T020233538965Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T020234416229Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.45s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1844"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1844_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1844_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1844_1"><button class="btn btn-outline-success"><span class="job_id">1844 : Job ID 37c3cbca21264466ab2f1227681b5f2a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1844_1" data-parent="#job_list___sub_accordion_1844" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1844_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=166" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (166, 15), end pos: (166, 37)</button></a></pre><pre>operator: core/AddNot, occurrence: 8</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -163,7 +163,7 @@ file_path = Path(__file__).parent / "static" / "Group_13.pdf" file_path = file_path.resolve() - if not file_path.exists(): + if not not file_path.exists(): self.app.logger.error(f"Source PDF not found: {file_path}") return jsonify({"error": "Source PDF not found"}), 500 </pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:167 Source PDF not found: C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\static\Group_13.pdf ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 20.22s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1845"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1845_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1845_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1845_1"><button class="btn btn-outline-success"><span class="job_id">1845 : Job ID 5012186bc97c49c8badb64b21284b196</span></button></div></a><div aria-labelledby="job_list___sub_heading_1845_1" data-parent="#job_list___sub_accordion_1845" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1845_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=182" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (182, 23), end pos: (182, 40)</button></a></pre><pre>operator: core/AddNot, occurrence: 9</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -179,7 +179,7 @@ {"path": str(file_path)}, ).first() - if not existing_file: + if not not existing_file: # Need to insert a full Documents row following schema: # (name, path, ownerid, sha256, size) # We don't have an authenticated user in RMAP flow, so we</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 20.86s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1846"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1846_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1846_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1846_1"><button class="btn btn-outline-success"><span class="job_id">1846 : Job ID 2879776a31c843a6866bf2ed8809b041</span></button></div></a><div aria-labelledby="job_list___sub_heading_1846_1" data-parent="#job_list___sub_accordion_1846" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1846_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=191" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (191, 27), end pos: (191, 40)</button></a></pre><pre>operator: core/AddNot, occurrence: 10</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -188,7 +188,7 @@ owner_row = conn.execute( text("SELECT id FROM Users WHERE email = 'service@rmap.su'") ).first() - if not owner_row: + if not not owner_row: raise RuntimeError( "No users exist to own RMAP base document; " "create a user first"</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T154347322004Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T154348195968Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:245 Failed to add source PDF to database: No users exist to own RMAP base document; create a user first ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 9 failed, 5 passed, 22 warnings in 19.10s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1847"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1847_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1847_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1847_1"><button class="btn btn-outline-danger"><span class="job_id">1847 : Job ID 17d9f15cda984f13abdd738d10b6d674</span></button></div></a><div aria-labelledby="job_list___sub_heading_1847_1" data-parent="#job_list___sub_accordion_1847" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1847_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=240" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (240, 35), end pos: (240, 52)</button></a></pre><pre>operator: core/AddNot, occurrence: 11</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -237,7 +237,7 @@ ), {"path": str(file_path)}, ).first() - if not existing_file: + if not not existing_file: raise race_e except Exception: raise</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.12s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1848"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1848_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1848_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1848_1"><button class="btn btn-outline-success"><span class="job_id">1848 : Job ID 7e6ad2770f794e938a13ce628de0f8a8</span></button></div></a><div aria-labelledby="job_list___sub_heading_1848_1" data-parent="#job_list___sub_accordion_1848" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1848_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=257" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (257, 15), end pos: (257, 29)</button></a></pre><pre>operator: core/AddNot, occurrence: 12</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -254,7 +254,7 @@ applicable = WMUtils.is_watermarking_applicable( method=method, pdf=str(file_path), position=None ) - if not applicable: + if not not applicable: return jsonify({"error": "Watermarking not applicable to PDF"}), 500 # Apply watermark</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 20.87s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1849"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1849_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1849_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1849_1"><button class="btn btn-outline-success"><span class="job_id">1849 : Job ID 749115caf3ab44da8522c683f1b7c411</span></button></div></a><div aria-labelledby="job_list___sub_heading_1849_1" data-parent="#job_list___sub_accordion_1849" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1849_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=269" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (269, 15), end pos: (269, 80)</button></a></pre><pre>operator: core/AddNot, occurrence: 13</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -266,7 +266,7 @@ position=None, ) - if not isinstance(wm_bytes, bytes | bytearray) or len(wm_bytes) == 0: + if not not isinstance(wm_bytes, bytes | bytearray) or len(wm_bytes) == 0: return jsonify({"error": "Watermarking produced no output"}), 500 # Create destination directory and file</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 20.37s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1850"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1850_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1850_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1850_1"><button class="btn btn-outline-danger"><span class="job_id">1850 : Job ID b1c816eaeb51440abebcb552d985a2b1</span></button></div></a><div aria-labelledby="job_list___sub_heading_1850_1" data-parent="#job_list___sub_accordion_1850" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1850_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=290" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (290, 23), end pos: (290, 78)</button></a></pre><pre>operator: core/AddNot, occurrence: 14</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -287,7 +287,7 @@ intended_for = self.rmap_instance.get_session_identity( session_secret ) - if intended_for is None or intended_for == "Unknown_Group": + if not intended_for is None or intended_for == "Unknown_Group": # Use a more descriptive fallback that # indicates RMAP authentication intended_for = "RMAP_CLIENT"</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.27s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1851"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1851_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1851_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1851_1"><button class="btn btn-outline-success"><span class="job_id">1851 : Job ID 456a2ef357e64ef6bce2017c60490775</span></button></div></a><div aria-labelledby="job_list___sub_heading_1851_1" data-parent="#job_list___sub_accordion_1851" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1851_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=304" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (304, 23), end pos: (304, 42)</button></a></pre><pre>operator: core/AddNot, occurrence: 15</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -301,7 +301,7 @@ ), {"path": str(file_path)}, ).first() - if file_record is None: + if not file_record is None: return jsonify({"error": "File record not found"}), 500 did = file_record.id </pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e26a3ca167f85bfa8: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 21.26s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1852"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1852_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1852_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1852_1"><button class="btn btn-outline-success"><span class="job_id">1852 : Job ID 8c22cc63a0ca4da19a9824d98b7fb92e</span></button></div></a><div aria-labelledby="job_list___sub_heading_1852_1" data-parent="#job_list___sub_accordion_1852" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1852_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=76" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (76, 46), end pos: (76, 50)</button></a></pre><pre>operator: core/ReplaceTrueWithFalse, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -73,7 +73,7 @@ def handle_rmap_initiate(self): """Handle RMAP message 1 (initiate authentication).""" try: - payload = request.get_json(silent=True) or {} + payload = request.get_json(silent=False) or {} result = self.rmap_instance.handle_message1(payload) if "error" in result:</pre></div><div class="alert alert-secondary"><pre class="diff">............F. [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt and inspect response payload decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) assert decrypted["nonceClient"] == test_nonce assert isinstance(decrypted["nonceServer"], int) # Test with wrong parameters # Missing params response = client.post("/api/rmap-initiate") &gt; assert response.status_code == 400 E assert 503 == 400 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:529: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 503 == 400 1 failed, 13 passed, 22 warnings in 20.50s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1853"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1853_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1853_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1853_1"><button class="btn btn-outline-success"><span class="job_id">1853 : Job ID f9c11f65381e43b2b21dcea4563b243a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1853_1" data-parent="#job_list___sub_accordion_1853" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1853_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=92" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (92, 46), end pos: (92, 50)</button></a></pre><pre>operator: core/ReplaceTrueWithFalse, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -89,7 +89,7 @@ def handle_rmap_get_link(self): """Handle RMAP message 2 (get session link).""" try: - payload = request.get_json(silent=True) or {} + payload = request.get_json(silent=False) or {} result = self.rmap_instance.handle_message2(payload) if "error" in result:</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "result" in json_data assert isinstance(json_data["result"], str) assert len(json_data["result"]) == 32 # Test with wrong parameters # Missing params response = client.post("/api/rmap-get-link") &gt; assert response.status_code == 400 E assert 503 == 400 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:581: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 503 == 400 1 failed, 13 passed, 22 warnings in 20.35s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1854"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1854_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1854_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1854_1"><button class="btn btn-outline-danger"><span class="job_id">1854 : Job ID b130ccbb0a9042ee88bb245a32d894cf</span></button></div></a><div aria-labelledby="job_list___sub_heading_1854_1" data-parent="#job_list___sub_accordion_1854" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1854_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=274" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (274, 35), end pos: (274, 39)</button></a></pre><pre>operator: core/ReplaceTrueWithFalse, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -271,7 +271,7 @@ # Create destination directory and file rmap_dir = storage_root / "rmap_watermarks" - rmap_dir.mkdir(parents=True, exist_ok=True) + rmap_dir.mkdir(parents=False, exist_ok=True) dest_filename = f"rmap_{session_secret}.pdf" dest_path = rmap_dir / dest_filename</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.52s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1855"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1855_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1855_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1855_1"><button class="btn btn-outline-success"><span class="job_id">1855 : Job ID eb4c410122db4e0ba31b5821b95dc235</span></button></div></a><div aria-labelledby="job_list___sub_heading_1855_1" data-parent="#job_list___sub_accordion_1855" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1855_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=274" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (274, 50), end pos: (274, 54)</button></a></pre><pre>operator: core/ReplaceTrueWithFalse, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -271,7 +271,7 @@ # Create destination directory and file rmap_dir = storage_root / "rmap_watermarks" - rmap_dir.mkdir(parents=True, exist_ok=True) + rmap_dir.mkdir(parents=True, exist_ok=False) dest_filename = f"rmap_{session_secret}.pdf" dest_path = rmap_dir / dest_filename</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T143719347515Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T143720274791Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614eeeb4bf18e8ee6d65: [WinError 183] Impossibile creare un file, se il file esiste gi%á: 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\rmap_watermarks' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 11 failed, 3 passed, 22 warnings in 20.03s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1856"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1856_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1856_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1856_1"><button class="btn btn-outline-success"><span class="job_id">1856 : Job ID 04f969b024df4ef09878292512f8beae</span></button></div></a><div aria-labelledby="job_list___sub_heading_1856_1" data-parent="#job_list___sub_accordion_1856" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1856_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=337" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (337, 48), end pos: (337, 52)</button></a></pre><pre>operator: core/ReplaceTrueWithFalse, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -334,7 +334,7 @@ except Exception as db_e: # If database insert fails, clean up the file try: - dest_path.unlink(missing_ok=True) + dest_path.unlink(missing_ok=False) except Exception as cleanup_e: self.app.logger.error( f"Failed to cleanup file after DB error: {cleanup_e}"</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e350f85cac569e03a: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.67s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1857"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1857_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1857_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1857_1"><button class="btn btn-outline-success"><span class="job_id">1857 : Job ID 8ddd47f8b25b446b8d2a702785712323</span></button></div></a><div aria-labelledby="job_list___sub_heading_1857_1" data-parent="#job_list___sub_accordion_1857" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1857_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=76" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (76, 52), end pos: (76, 54)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -73,7 +73,7 @@ def handle_rmap_initiate(self): """Handle RMAP message 1 (initiate authentication).""" try: - payload = request.get_json(silent=True) or {} + payload = request.get_json(silent=True) and {} result = self.rmap_instance.handle_message1(payload) if "error" in result:</pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse streamed [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse streamed [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 400 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 400 == 200 2 failed, 12 passed, 22 warnings in 16.27s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1858"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1858_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1858_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1858_1"><button class="btn btn-outline-success"><span class="job_id">1858 : Job ID cbb807601b4141c580a04d69f36955e2</span></button></div></a><div aria-labelledby="job_list___sub_heading_1858_1" data-parent="#job_list___sub_accordion_1858" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1858_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=92" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (92, 52), end pos: (92, 54)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -89,7 +89,7 @@ def handle_rmap_get_link(self): """Handle RMAP message 2 (get session link).""" try: - payload = request.get_json(silent=True) or {} + payload = request.get_json(silent=True) and {} result = self.rmap_instance.handle_message2(payload) if "error" in result:</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse streamed [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:571: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 400 == 200 1 failed, 13 passed, 22 warnings in 20.08s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1859"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1859_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1859_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1859_1"><button class="btn btn-outline-danger"><span class="job_id">1859 : Job ID b628621373224cf2839c18fcc9f315cc</span></button></div></a><div aria-labelledby="job_list___sub_heading_1859_1" data-parent="#job_list___sub_accordion_1859" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1859_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=269" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (269, 59), end pos: (269, 61)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -266,7 +266,7 @@ position=None, ) - if not isinstance(wm_bytes, bytes | bytearray) or len(wm_bytes) == 0: + if not isinstance(wm_bytes, bytes | bytearray) and len(wm_bytes) == 0: return jsonify({"error": "Watermarking produced no output"}), 500 # Create destination directory and file</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.30s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1860"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1860_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1860_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1860_1"><button class="btn btn-outline-success"><span class="job_id">1860 : Job ID c81a09a5ee714a4795d71f9badf64348</span></button></div></a><div aria-labelledby="job_list___sub_heading_1860_1" data-parent="#job_list___sub_accordion_1860" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1860_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=290" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (290, 44), end pos: (290, 46)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -287,7 +287,7 @@ intended_for = self.rmap_instance.get_session_identity( session_secret ) - if intended_for is None or intended_for == "Unknown_Group": + if intended_for is None and intended_for == "Unknown_Group": # Use a more descriptive fallback that # indicates RMAP authentication intended_for = "RMAP_CLIENT"</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e4c1b58983081cbc0: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 21.40s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1861"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1861_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1861_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1861_1"><button class="btn btn-outline-success"><span class="job_id">1861 : Job ID 448ccc88b38e4e27b5f5c3e8611d2c5c</span></button></div></a><div aria-labelledby="job_list___sub_heading_1861_1" data-parent="#job_list___sub_accordion_1861" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1861_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=84" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (84, 15), end pos: (84, 24)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -81,7 +81,7 @@ return jsonify(result), 200 - except Exception as e: + except CosmicRayTestingException as e: return jsonify( {"error": f"RMAP system initialization failed: {str(e)}"} ), 503</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T165541784760Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T165542615619Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.27s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1862"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1862_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1862_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1862_1"><button class="btn btn-outline-success"><span class="job_id">1862 : Job ID 942601b50cf74301b5989545a70eb8b5</span></button></div></a><div aria-labelledby="job_list___sub_heading_1862_1" data-parent="#job_list___sub_accordion_1862" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1862_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=109" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (109, 15), end pos: (109, 24)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -106,7 +106,7 @@ return jsonify(result), 200 - except Exception as e: + except CosmicRayTestingException as e: return jsonify({"error": f"RMAP system error: {str(e)}"}), 503 def _create_watermarked_pdf_for_session(self, session_secret: str) -&gt; Any | None:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T234311331358Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T234312207157Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.32s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1863"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1863_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1863_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1863_1"><button class="btn btn-outline-danger"><span class="job_id">1863 : Job ID e6243c6a1a21439794a4f0bff577e214</span></button></div></a><div aria-labelledby="job_list___sub_heading_1863_1" data-parent="#job_list___sub_accordion_1863" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1863_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=155" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (155, 15), end pos: (155, 24)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -152,7 +152,7 @@ f" {session_secret}" ) - except Exception as e: + except CosmicRayTestingException as e: return jsonify({"error": f"Database error: {str(e)}"}), 500 # Create watermarked PDF</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.31s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1864"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1864_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1864_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1864_1"><button class="btn btn-outline-danger"><span class="job_id">1864 : Job ID 721dc33939a24a76b20b891928e36638</span></button></div></a><div aria-labelledby="job_list___sub_heading_1864_1" data-parent="#job_list___sub_accordion_1864" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1864_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=201" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (201, 31), end pos: (201, 40)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -198,7 +198,7 @@ # Gather file metadata try: pdf_bytes = file_path.read_bytes() - except Exception as fe: + except CosmicRayTestingException as fe: raise RuntimeError( f"Failed reading source PDF for RMAP insertion: {fe}" ) from fe</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.34s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1865"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1865_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1865_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1865_1"><button class="btn btn-outline-danger"><span class="job_id">1865 : Job ID 66620826918d4848891420ac4da2f03c</span></button></div></a><div aria-labelledby="job_list___sub_heading_1865_1" data-parent="#job_list___sub_accordion_1865" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1865_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=229" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (229, 31), end pos: (229, 40)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -226,7 +226,7 @@ "size": int(size), }, ) - except Exception as race_e: + except CosmicRayTestingException as race_e: # If due to unique path constraint, fetch existing id; # otherwise re-raise try:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.14s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1866"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1866_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1866_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1866_1"><button class="btn btn-outline-danger"><span class="job_id">1866 : Job ID fbeab58e1dc04bbba49ee92570581056</span></button></div></a><div aria-labelledby="job_list___sub_heading_1866_1" data-parent="#job_list___sub_accordion_1866" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1866_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=242" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (242, 35), end pos: (242, 44)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -239,7 +239,7 @@ ).first() if not existing_file: raise race_e - except Exception: + except CosmicRayTestingException: raise except Exception as db_e: self.app.logger.error(f"Failed to add source PDF to database: {db_e}")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.20s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1867"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1867_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1867_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1867_1"><button class="btn btn-outline-danger"><span class="job_id">1867 : Job ID 479facbe794a4b3f9ff444cc8bb615b9</span></button></div></a><div aria-labelledby="job_list___sub_heading_1867_1" data-parent="#job_list___sub_accordion_1867" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1867_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=244" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (244, 19), end pos: (244, 28)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -241,7 +241,7 @@ raise race_e except Exception: raise - except Exception as db_e: + except CosmicRayTestingException as db_e: self.app.logger.error(f"Failed to add source PDF to database: {db_e}") return jsonify({"error": f"Database error: {str(db_e)}"}), 500 </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.33s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1868"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1868_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1868_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1868_1"><button class="btn btn-outline-danger"><span class="job_id">1868 : Job ID 4fbc445c96034a7fa99993ef53674bbd</span></button></div></a><div aria-labelledby="job_list___sub_heading_1868_1" data-parent="#job_list___sub_accordion_1868" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1868_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=334" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (334, 19), end pos: (334, 28)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -331,7 +331,7 @@ ) return None # Success - except Exception as db_e: + except CosmicRayTestingException as db_e: # If database insert fails, clean up the file try: dest_path.unlink(missing_ok=True)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.87s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1869"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1869_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1869_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1869_1"><button class="btn btn-outline-danger"><span class="job_id">1869 : Job ID 24b484a2c6a549d1a522837aad1787e0</span></button></div></a><div aria-labelledby="job_list___sub_heading_1869_1" data-parent="#job_list___sub_accordion_1869" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1869_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=338" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (338, 23), end pos: (338, 32)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 8</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -335,7 +335,7 @@ # If database insert fails, clean up the file try: dest_path.unlink(missing_ok=True) - except Exception as cleanup_e: + except CosmicRayTestingException as cleanup_e: self.app.logger.error( f"Failed to cleanup file after DB error: {cleanup_e}" )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.03s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1870"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1870_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1870_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1870_1"><button class="btn btn-outline-success"><span class="job_id">1870 : Job ID 11760aff8d3f42ac91a99947b51f64a0</span></button></div></a><div aria-labelledby="job_list___sub_heading_1870_1" data-parent="#job_list___sub_accordion_1870" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1870_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=351" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (351, 15), end pos: (351, 24)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 9</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -348,7 +348,7 @@ {"error": f"Database insertion failed: {str(db_e)}"} ), 500 - except Exception as e: + except CosmicRayTestingException as e: self.app.logger.error( f"Failed to create watermarked PDF for session" f" {session_secret}: {str(e)}"</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T060019164842Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T060020061514Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.53s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1871"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1871_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1871_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1871_1"><button class="btn btn-outline-success"><span class="job_id">1871 : Job ID acb826a8cfbb447c8120c0a460efd5f4</span></button></div></a><div aria-labelledby="job_list___sub_heading_1871_1" data-parent="#job_list___sub_accordion_1871" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1871_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=80" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (80, 40), end pos: (80, 43)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -77,7 +77,7 @@ result = self.rmap_instance.handle_message1(payload) if "error" in result: - return jsonify(result), 400 if "required" in result["error"] else 503 + return jsonify(result), 401 if "required" in result["error"] else 503 return jsonify(result), 200 </pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFFFF [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt and inspect response payload decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) assert decrypted["nonceClient"] == test_nonce assert isinstance(decrypted["nonceServer"], int) # Test with wrong parameters # Missing params response = client.post("/api/rmap-initiate") &gt; assert response.status_code == 400 E assert 401 == 400 E + where 401 = &lt;WrapperTestResponse streamed [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:529: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e6b98cee734f94f1a: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 401 == 400 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 6 failed, 8 passed, 22 warnings in 19.77s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1872"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1872_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1872_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1872_1"><button class="btn btn-outline-success"><span class="job_id">1872 : Job ID e59d7216b8544be298b9830041c1166e</span></button></div></a><div aria-labelledby="job_list___sub_heading_1872_1" data-parent="#job_list___sub_accordion_1872" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1872_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=80" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (80, 40), end pos: (80, 43)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -77,7 +77,7 @@ result = self.rmap_instance.handle_message1(payload) if "error" in result: - return jsonify(result), 400 if "required" in result["error"] else 503 + return jsonify(result), 399 if "required" in result["error"] else 503 return jsonify(result), 200 </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFFF. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T061138162127Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T061139095548Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt and inspect response payload decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) assert decrypted["nonceClient"] == test_nonce assert isinstance(decrypted["nonceServer"], int) # Test with wrong parameters # Missing params response = client.post("/api/rmap-initiate") &gt; assert response.status_code == 400 E assert 399 == 400 E + where 399 = &lt;WrapperTestResponse streamed [399 UNKNOWN]&gt;.status_code ..\test\test_api.py:529: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 399 == 400 10 failed, 4 passed, 22 warnings in 20.51s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1873"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1873_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1873_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1873_1"><button class="btn btn-outline-success"><span class="job_id">1873 : Job ID b4b3b32862aa45d8a1fd84ade28347e6</span></button></div></a><div aria-labelledby="job_list___sub_heading_1873_1" data-parent="#job_list___sub_accordion_1873" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1873_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=80" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (80, 82), end pos: (80, 85)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -77,7 +77,7 @@ result = self.rmap_instance.handle_message1(payload) if "error" in result: - return jsonify(result), 400 if "required" in result["error"] else 503 + return jsonify(result), 400 if "required" in result["error"] else 504 return jsonify(result), 200 </pre></div><div class="alert alert-secondary"><pre class="diff">............F. [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt and inspect response payload decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) assert decrypted["nonceClient"] == test_nonce assert isinstance(decrypted["nonceServer"], int) # Test with wrong parameters # Missing params response = client.post("/api/rmap-initiate") assert response.status_code == 400 # Wrong format params response = client.post("/api/rmap-initiate", json={"payload":"wrongformatstring"}) &gt; assert response.status_code == 503 E assert 504 == 503 E + where 504 = &lt;WrapperTestResponse streamed [504 GATEWAY TIMEOUT]&gt;.status_code ..\test\test_api.py:533: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 504 == 503 1 failed, 13 passed, 22 warnings in 20.63s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1874"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1874_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1874_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1874_1"><button class="btn btn-outline-success"><span class="job_id">1874 : Job ID 8f824d54ab264cb3ac92329f3e430ef1</span></button></div></a><div aria-labelledby="job_list___sub_heading_1874_1" data-parent="#job_list___sub_accordion_1874" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1874_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=80" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (80, 82), end pos: (80, 85)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -77,7 +77,7 @@ result = self.rmap_instance.handle_message1(payload) if "error" in result: - return jsonify(result), 400 if "required" in result["error"] else 503 + return jsonify(result), 400 if "required" in result["error"] else 502 return jsonify(result), 200 </pre></div><div class="alert alert-secondary"><pre class="diff">............F. [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt and inspect response payload decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) assert decrypted["nonceClient"] == test_nonce assert isinstance(decrypted["nonceServer"], int) # Test with wrong parameters # Missing params response = client.post("/api/rmap-initiate") assert response.status_code == 400 # Wrong format params response = client.post("/api/rmap-initiate", json={"payload":"wrongformatstring"}) &gt; assert response.status_code == 503 E assert 502 == 503 E + where 502 = &lt;WrapperTestResponse streamed [502 BAD GATEWAY]&gt;.status_code ..\test\test_api.py:533: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 502 == 503 1 failed, 13 passed, 22 warnings in 20.55s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1875"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1875_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1875_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1875_1"><button class="btn btn-outline-success"><span class="job_id">1875 : Job ID 17459385374f4d9d9ca3f37156434e78</span></button></div></a><div aria-labelledby="job_list___sub_heading_1875_1" data-parent="#job_list___sub_accordion_1875" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1875_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=82" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (82, 36), end pos: (82, 39)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -79,7 +79,7 @@ if "error" in result: return jsonify(result), 400 if "required" in result["error"] else 503 - return jsonify(result), 200 + return jsonify(result), 201 except Exception as e: return jsonify(</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFFFF [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T030414885720Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T030415828866Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 201 == 200 E + where 201 = &lt;WrapperTestResponse streamed [201 CREATED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 201 == 200 E + where 201 = &lt;WrapperTestResponse streamed [201 CREATED]&gt;.status_code ..\test\test_api.py:553: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 201 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 201 == 200 12 failed, 2 passed, 22 warnings in 17.60s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1876"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1876_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1876_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1876_1"><button class="btn btn-outline-success"><span class="job_id">1876 : Job ID 352bb851c4d941779635b3f6084cf942</span></button></div></a><div aria-labelledby="job_list___sub_heading_1876_1" data-parent="#job_list___sub_accordion_1876" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1876_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=82" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (82, 36), end pos: (82, 39)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -79,7 +79,7 @@ if "error" in result: return jsonify(result), 400 if "required" in result["error"] else 503 - return jsonify(result), 200 + return jsonify(result), 199 except Exception as e: return jsonify(</pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 199 == 200 E + where 199 = &lt;WrapperTestResponse streamed [199 UNKNOWN]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 199 == 200 E + where 199 = &lt;WrapperTestResponse streamed [199 UNKNOWN]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 199 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 199 == 200 2 failed, 12 passed, 22 warnings in 18.31s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1877"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1877_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1877_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1877_1"><button class="btn btn-outline-danger"><span class="job_id">1877 : Job ID c19bd2697a9645f8a4c5371940d6b7bf</span></button></div></a><div aria-labelledby="job_list___sub_heading_1877_1" data-parent="#job_list___sub_accordion_1877" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1877_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=87" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (87, 15), end pos: (87, 18)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -84,7 +84,7 @@ except Exception as e: return jsonify( {"error": f"RMAP system initialization failed: {str(e)}"} - ), 503 + ), 504 def handle_rmap_get_link(self): """Handle RMAP message 2 (get session link)."""</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.45s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1878"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1878_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1878_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1878_1"><button class="btn btn-outline-danger"><span class="job_id">1878 : Job ID c6940d5af6934c47a04d8f06244540dd</span></button></div></a><div aria-labelledby="job_list___sub_heading_1878_1" data-parent="#job_list___sub_accordion_1878" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1878_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=87" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (87, 15), end pos: (87, 18)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -84,7 +84,7 @@ except Exception as e: return jsonify( {"error": f"RMAP system initialization failed: {str(e)}"} - ), 503 + ), 502 def handle_rmap_get_link(self): """Handle RMAP message 2 (get session link)."""</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.99s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1879"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1879_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1879_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1879_1"><button class="btn btn-outline-success"><span class="job_id">1879 : Job ID 2c7af37dc78241519b910b29554e0b1e</span></button></div></a><div aria-labelledby="job_list___sub_heading_1879_1" data-parent="#job_list___sub_accordion_1879" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1879_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=96" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (96, 40), end pos: (96, 43)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 8</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -93,7 +93,7 @@ result = self.rmap_instance.handle_message2(payload) if "error" in result: - return jsonify(result), 400 if "required" in result["error"] else 503 + return jsonify(result), 401 if "required" in result["error"] else 503 # If RMAP authentication succeeded, create watermarked PDF if "result" in result:</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "result" in json_data assert isinstance(json_data["result"], str) assert len(json_data["result"]) == 32 # Test with wrong parameters # Missing params response = client.post("/api/rmap-get-link") &gt; assert response.status_code == 400 E assert 401 == 400 E + where 401 = &lt;WrapperTestResponse streamed [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:581: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 401 == 400 1 failed, 13 passed, 22 warnings in 20.31s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1880"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1880_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1880_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1880_1"><button class="btn btn-outline-success"><span class="job_id">1880 : Job ID aa294c8ee3ae4e3198b9fa12493329e6</span></button></div></a><div aria-labelledby="job_list___sub_heading_1880_1" data-parent="#job_list___sub_accordion_1880" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1880_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=96" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (96, 40), end pos: (96, 43)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 9</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -93,7 +93,7 @@ result = self.rmap_instance.handle_message2(payload) if "error" in result: - return jsonify(result), 400 if "required" in result["error"] else 503 + return jsonify(result), 399 if "required" in result["error"] else 503 # If RMAP authentication succeeded, create watermarked PDF if "result" in result:</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "result" in json_data assert isinstance(json_data["result"], str) assert len(json_data["result"]) == 32 # Test with wrong parameters # Missing params response = client.post("/api/rmap-get-link") &gt; assert response.status_code == 400 E assert 399 == 400 E + where 399 = &lt;WrapperTestResponse streamed [399 UNKNOWN]&gt;.status_code ..\test\test_api.py:581: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 399 == 400 1 failed, 13 passed, 22 warnings in 20.15s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1881"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1881_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1881_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1881_1"><button class="btn btn-outline-success"><span class="job_id">1881 : Job ID fd253da927624826ab7fdc4622abbc3d</span></button></div></a><div aria-labelledby="job_list___sub_heading_1881_1" data-parent="#job_list___sub_accordion_1881" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1881_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=96" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (96, 82), end pos: (96, 85)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 10</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -93,7 +93,7 @@ result = self.rmap_instance.handle_message2(payload) if "error" in result: - return jsonify(result), 400 if "required" in result["error"] else 503 + return jsonify(result), 400 if "required" in result["error"] else 504 # If RMAP authentication succeeded, create watermarked PDF if "result" in result:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T003941922118Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T003942849722Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "result" in json_data assert isinstance(json_data["result"], str) assert len(json_data["result"]) == 32 # Test with wrong parameters # Missing params response = client.post("/api/rmap-get-link") assert response.status_code == 400 # Wrong format params response = client.post("/api/rmap-get-link", json={"payload":"wrongformatstring"}) &gt; assert response.status_code == 503 E assert 504 == 503 E + where 504 = &lt;WrapperTestResponse streamed [504 GATEWAY TIMEOUT]&gt;.status_code ..\test\test_api.py:585: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 504 == 503 9 failed, 5 passed, 22 warnings in 19.23s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1882"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1882_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1882_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1882_1"><button class="btn btn-outline-success"><span class="job_id">1882 : Job ID 8641cebf1ad84eb09211c8d9083defe1</span></button></div></a><div aria-labelledby="job_list___sub_heading_1882_1" data-parent="#job_list___sub_accordion_1882" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1882_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=96" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (96, 82), end pos: (96, 85)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 11</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -93,7 +93,7 @@ result = self.rmap_instance.handle_message2(payload) if "error" in result: - return jsonify(result), 400 if "required" in result["error"] else 503 + return jsonify(result), 400 if "required" in result["error"] else 502 # If RMAP authentication succeeded, create watermarked PDF if "result" in result:</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "result" in json_data assert isinstance(json_data["result"], str) assert len(json_data["result"]) == 32 # Test with wrong parameters # Missing params response = client.post("/api/rmap-get-link") assert response.status_code == 400 # Wrong format params response = client.post("/api/rmap-get-link", json={"payload":"wrongformatstring"}) &gt; assert response.status_code == 503 E assert 502 == 503 E + where 502 = &lt;WrapperTestResponse streamed [502 BAD GATEWAY]&gt;.status_code ..\test\test_api.py:585: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 502 == 503 1 failed, 13 passed, 22 warnings in 20.50s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1883"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1883_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1883_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1883_1"><button class="btn btn-outline-success"><span class="job_id">1883 : Job ID 7f5cc9f60ad7499ba5d1b2d2bb78ee3e</span></button></div></a><div aria-labelledby="job_list___sub_heading_1883_1" data-parent="#job_list___sub_accordion_1883" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1883_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=107" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (107, 36), end pos: (107, 39)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 12</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -104,7 +104,7 @@ if pdf_result is not None: return pdf_result # Return error response if PDF creation failed - return jsonify(result), 200 + return jsonify(result), 201 except Exception as e: return jsonify({"error": f"RMAP system error: {str(e)}"}), 503</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 201 == 200 E + where 201 = &lt;WrapperTestResponse streamed [201 CREATED]&gt;.status_code ..\test\test_api.py:571: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 201 == 200 1 failed, 13 passed, 22 warnings in 20.23s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1884"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1884_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1884_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1884_1"><button class="btn btn-outline-success"><span class="job_id">1884 : Job ID 1418f1d10a05457fa95763d033646aaa</span></button></div></a><div aria-labelledby="job_list___sub_heading_1884_1" data-parent="#job_list___sub_accordion_1884" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1884_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=107" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (107, 36), end pos: (107, 39)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 13</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -104,7 +104,7 @@ if pdf_result is not None: return pdf_result # Return error response if PDF creation failed - return jsonify(result), 200 + return jsonify(result), 199 except Exception as e: return jsonify({"error": f"RMAP system error: {str(e)}"}), 503</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 199 == 200 E + where 199 = &lt;WrapperTestResponse streamed [199 UNKNOWN]&gt;.status_code ..\test\test_api.py:571: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 199 == 200 1 failed, 13 passed, 22 warnings in 20.21s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1885"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1885_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1885_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1885_1"><button class="btn btn-outline-success"><span class="job_id">1885 : Job ID b622732977bd43af89582b79f2fb1e12</span></button></div></a><div aria-labelledby="job_list___sub_heading_1885_1" data-parent="#job_list___sub_accordion_1885" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1885_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=110" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (110, 71), end pos: (110, 74)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 14</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -107,7 +107,7 @@ return jsonify(result), 200 except Exception as e: - return jsonify({"error": f"RMAP system error: {str(e)}"}), 503 + return jsonify({"error": f"RMAP system error: {str(e)}"}), 504 def _create_watermarked_pdf_for_session(self, session_secret: str) -&gt; Any | None: """</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 4 failed, 10 passed, 22 warnings in 21.69s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1886"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1886_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1886_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1886_1"><button class="btn btn-outline-success"><span class="job_id">1886 : Job ID b9caae6ad06946d080fbc47980c233b6</span></button></div></a><div aria-labelledby="job_list___sub_heading_1886_1" data-parent="#job_list___sub_accordion_1886" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1886_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=110" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (110, 71), end pos: (110, 74)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 15</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -107,7 +107,7 @@ return jsonify(result), 200 except Exception as e: - return jsonify({"error": f"RMAP system error: {str(e)}"}), 503 + return jsonify({"error": f"RMAP system error: {str(e)}"}), 502 def _create_watermarked_pdf_for_session(self, session_secret: str) -&gt; Any | None: """</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T175315847987Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T175316726120Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.21s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1887"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1887_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1887_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1887_1"><button class="btn btn-outline-danger"><span class="job_id">1887 : Job ID 57fa9291ab2e480db687193ec31aecd9</span></button></div></a><div aria-labelledby="job_list___sub_heading_1887_1" data-parent="#job_list___sub_accordion_1887" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1887_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=156" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (156, 68), end pos: (156, 71)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 16</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -153,7 +153,7 @@ ) except Exception as e: - return jsonify({"error": f"Database error: {str(e)}"}), 500 + return jsonify({"error": f"Database error: {str(e)}"}), 501 # Create watermarked PDF try:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.49s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1888"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1888_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1888_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1888_1"><button class="btn btn-outline-danger"><span class="job_id">1888 : Job ID 05a6f73b53774aedb9f3ebd34b2b63cc</span></button></div></a><div aria-labelledby="job_list___sub_heading_1888_1" data-parent="#job_list___sub_accordion_1888" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1888_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=156" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (156, 68), end pos: (156, 71)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 17</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -153,7 +153,7 @@ ) except Exception as e: - return jsonify({"error": f"Database error: {str(e)}"}), 500 + return jsonify({"error": f"Database error: {str(e)}"}), 499 # Create watermarked PDF try:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.04s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1889"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1889_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1889_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1889_1"><button class="btn btn-outline-danger"><span class="job_id">1889 : Job ID 123164a3620a4f1d9bf4ba2183c52c25</span></button></div></a><div aria-labelledby="job_list___sub_heading_1889_1" data-parent="#job_list___sub_accordion_1889" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1889_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=168" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (168, 67), end pos: (168, 70)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 18</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -165,7 +165,7 @@ if not file_path.exists(): self.app.logger.error(f"Source PDF not found: {file_path}") - return jsonify({"error": "Source PDF not found"}), 500 + return jsonify({"error": "Source PDF not found"}), 501 # Add file to database if not already present try:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.17s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1890"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1890_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1890_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1890_1"><button class="btn btn-outline-danger"><span class="job_id">1890 : Job ID 49e1cd12374f4b43af26e2094cf3e51c</span></button></div></a><div aria-labelledby="job_list___sub_heading_1890_1" data-parent="#job_list___sub_accordion_1890" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1890_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=168" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (168, 67), end pos: (168, 70)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 19</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -165,7 +165,7 @@ if not file_path.exists(): self.app.logger.error(f"Source PDF not found: {file_path}") - return jsonify({"error": "Source PDF not found"}), 500 + return jsonify({"error": "Source PDF not found"}), 499 # Add file to database if not already present try:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.09s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1891"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1891_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1891_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1891_1"><button class="btn btn-outline-danger"><span class="job_id">1891 : Job ID 2be1da39b9854decbba70758bfbdec8d</span></button></div></a><div aria-labelledby="job_list___sub_heading_1891_1" data-parent="#job_list___sub_accordion_1891" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1891_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=246" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (246, 75), end pos: (246, 78)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 20</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -243,7 +243,7 @@ raise except Exception as db_e: self.app.logger.error(f"Failed to add source PDF to database: {db_e}") - return jsonify({"error": f"Database error: {str(db_e)}"}), 500 + return jsonify({"error": f"Database error: {str(db_e)}"}), 501 # Use robust-xmp watermarking (best technique) method = "robust-xmp"</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.27s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1892"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1892_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1892_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1892_1"><button class="btn btn-outline-danger"><span class="job_id">1892 : Job ID 37c39b0efb1647f7886dcbb3fd8b198d</span></button></div></a><div aria-labelledby="job_list___sub_heading_1892_1" data-parent="#job_list___sub_accordion_1892" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1892_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=246" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (246, 75), end pos: (246, 78)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 21</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -243,7 +243,7 @@ raise except Exception as db_e: self.app.logger.error(f"Failed to add source PDF to database: {db_e}") - return jsonify({"error": f"Database error: {str(db_e)}"}), 500 + return jsonify({"error": f"Database error: {str(db_e)}"}), 499 # Use robust-xmp watermarking (best technique) method = "robust-xmp"</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.19s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1893"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1893_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1893_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1893_1"><button class="btn btn-outline-danger"><span class="job_id">1893 : Job ID 716f565fefd941ea8fa692a6fcd747c3</span></button></div></a><div aria-labelledby="job_list___sub_heading_1893_1" data-parent="#job_list___sub_accordion_1893" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1893_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=258" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (258, 81), end pos: (258, 84)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 22</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -255,7 +255,7 @@ method=method, pdf=str(file_path), position=None ) if not applicable: - return jsonify({"error": "Watermarking not applicable to PDF"}), 500 + return jsonify({"error": "Watermarking not applicable to PDF"}), 501 # Apply watermark wm_bytes = WMUtils.apply_watermark(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.44s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1894"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1894_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1894_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1894_1"><button class="btn btn-outline-danger"><span class="job_id">1894 : Job ID 8033ded2cdf445a5910fc9d5c31d0b1e</span></button></div></a><div aria-labelledby="job_list___sub_heading_1894_1" data-parent="#job_list___sub_accordion_1894" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1894_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=258" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (258, 81), end pos: (258, 84)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 23</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -255,7 +255,7 @@ method=method, pdf=str(file_path), position=None ) if not applicable: - return jsonify({"error": "Watermarking not applicable to PDF"}), 500 + return jsonify({"error": "Watermarking not applicable to PDF"}), 499 # Apply watermark wm_bytes = WMUtils.apply_watermark(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.05s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1895"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1895_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1895_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1895_1"><button class="btn btn-outline-danger"><span class="job_id">1895 : Job ID 90988ea4827c4578a345cb755efd4e4a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1895_1" data-parent="#job_list___sub_accordion_1895" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1895_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=269" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (269, 79), end pos: (269, 80)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 24</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -266,7 +266,7 @@ position=None, ) - if not isinstance(wm_bytes, bytes | bytearray) or len(wm_bytes) == 0: + if not isinstance(wm_bytes, bytes | bytearray) or len(wm_bytes) == 1: return jsonify({"error": "Watermarking produced no output"}), 500 # Create destination directory and file</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.58s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1896"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1896_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1896_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1896_1"><button class="btn btn-outline-danger"><span class="job_id">1896 : Job ID 341aa250699d4ccca7a668ba01c35d61</span></button></div></a><div aria-labelledby="job_list___sub_heading_1896_1" data-parent="#job_list___sub_accordion_1896" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1896_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=269" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (269, 79), end pos: (269, 80)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 25</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -266,7 +266,7 @@ position=None, ) - if not isinstance(wm_bytes, bytes | bytearray) or len(wm_bytes) == 0: + if not isinstance(wm_bytes, bytes | bytearray) or len(wm_bytes) == -1: return jsonify({"error": "Watermarking produced no output"}), 500 # Create destination directory and file</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.62s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1897"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1897_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1897_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1897_1"><button class="btn btn-outline-success"><span class="job_id">1897 : Job ID 5ab4aa6c38564ac7857d63d8887eb358</span></button></div></a><div aria-labelledby="job_list___sub_heading_1897_1" data-parent="#job_list___sub_accordion_1897" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1897_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=270" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (270, 78), end pos: (270, 81)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 26</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -267,7 +267,7 @@ ) if not isinstance(wm_bytes, bytes | bytearray) or len(wm_bytes) == 0: - return jsonify({"error": "Watermarking produced no output"}), 500 + return jsonify({"error": "Watermarking produced no output"}), 501 # Create destination directory and file rmap_dir = storage_root / "rmap_watermarks"</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ee77bd2261c15d32a: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 21.07s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1898"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1898_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1898_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1898_1"><button class="btn btn-outline-danger"><span class="job_id">1898 : Job ID acdf7524d4c94f06a665a5c02a5f0f97</span></button></div></a><div aria-labelledby="job_list___sub_heading_1898_1" data-parent="#job_list___sub_accordion_1898" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1898_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=270" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (270, 78), end pos: (270, 81)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 27</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -267,7 +267,7 @@ ) if not isinstance(wm_bytes, bytes | bytearray) or len(wm_bytes) == 0: - return jsonify({"error": "Watermarking produced no output"}), 500 + return jsonify({"error": "Watermarking produced no output"}), 499 # Create destination directory and file rmap_dir = storage_root / "rmap_watermarks"</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.11s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1899"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1899_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1899_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1899_1"><button class="btn btn-outline-danger"><span class="job_id">1899 : Job ID 06c9152d317b4bca8f40675aa25722ab</span></button></div></a><div aria-labelledby="job_list___sub_heading_1899_1" data-parent="#job_list___sub_accordion_1899" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1899_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=305" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (305, 76), end pos: (305, 79)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 28</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -302,7 +302,7 @@ {"path": str(file_path)}, ).first() if file_record is None: - return jsonify({"error": "File record not found"}), 500 + return jsonify({"error": "File record not found"}), 501 did = file_record.id conn.execute(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.21s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1900"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1900_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1900_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1900_1"><button class="btn btn-outline-danger"><span class="job_id">1900 : Job ID 0fb71c096aa74b71aaec08f960188032</span></button></div></a><div aria-labelledby="job_list___sub_heading_1900_1" data-parent="#job_list___sub_accordion_1900" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1900_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=305" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (305, 76), end pos: (305, 79)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 29</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -302,7 +302,7 @@ {"path": str(file_path)}, ).first() if file_record is None: - return jsonify({"error": "File record not found"}), 500 + return jsonify({"error": "File record not found"}), 499 did = file_record.id conn.execute(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.46s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1901"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1901_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1901_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1901_1"><button class="btn btn-outline-danger"><span class="job_id">1901 : Job ID abc04d4c40f24525b0624f75862b55d5</span></button></div></a><div aria-labelledby="job_list___sub_heading_1901_1" data-parent="#job_list___sub_accordion_1901" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1901_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=349" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (349, 19), end pos: (349, 22)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 30</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -346,7 +346,7 @@ ) return jsonify( {"error": f"Database insertion failed: {str(db_e)}"} - ), 500 + ), 501 except Exception as e: self.app.logger.error(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.04s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1902"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1902_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1902_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1902_1"><button class="btn btn-outline-danger"><span class="job_id">1902 : Job ID 4820ede93b394ac9939cc7a51a1fed3f</span></button></div></a><div aria-labelledby="job_list___sub_heading_1902_1" data-parent="#job_list___sub_accordion_1902" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1902_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=349" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (349, 19), end pos: (349, 22)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 31</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -346,7 +346,7 @@ ) return jsonify( {"error": f"Database insertion failed: {str(db_e)}"} - ), 500 + ), 499 except Exception as e: self.app.logger.error(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.86s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1903"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1903_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1903_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1903_1"><button class="btn btn-outline-danger"><span class="job_id">1903 : Job ID c5e034bcf12840c0ac5f268e1a73e5f3</span></button></div></a><div aria-labelledby="job_list___sub_heading_1903_1" data-parent="#job_list___sub_accordion_1903" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1903_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=358" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (358, 15), end pos: (358, 18)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 32</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -355,5 +355,5 @@ ) return jsonify( {"error": f"Failed to create watermarked PDF: {str(e)}"} - ), 500 - + ), 501 +</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.02s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1904"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1904_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1904_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1904_1"><button class="btn btn-outline-success"><span class="job_id">1904 : Job ID 715c780b4c1d4b94a8cf670cd465e1bf</span></button></div></a><div aria-labelledby="job_list___sub_heading_1904_1" data-parent="#job_list___sub_accordion_1904" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1904_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=rmap_handler.py&amp;line=358" class="text-secondary"><button class="btn btn-outline-dark">rmap_handler.py, start pos: (358, 15), end pos: (358, 18)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 33</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- armap_handler.py +++ brmap_handler.py @@ -355,5 +355,5 @@ ) return jsonify( {"error": f"Failed to create watermarked PDF: {str(e)}"} - ), 500 - + ), 499 +</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 499 == 200 E + where 499 = &lt;WrapperTestResponse streamed [499 UNKNOWN]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614eb8f729f6d8b38b28: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 499 == 200 5 failed, 9 passed, 22 warnings in 19.74s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1905"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1905_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1905_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1905_1"><button class="btn btn-outline-danger"><span class="job_id">1905 : Job ID c2f5acec443b44f9a8c9fcfcd89859cb</span></button></div></a><div aria-labelledby="job_list___sub_heading_1905_1" data-parent="#job_list___sub_accordion_1905" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1905_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=52" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (52, 46), end pos: (52, 47)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Add, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -49,7 +49,7 @@ if public_keys_dir is None: # Default to public-keys/pki directory relative to server root server_root = Path(__file__).parent.parent - public_keys_dir = str(server_root / "public-keys" / "pki") + public_keys_dir = str(server_root + "public-keys" / "pki") if server_private_key is None: # Default to server_priv.asc in src directory</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.04s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1906"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1906_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1906_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1906_1"><button class="btn btn-outline-success"><span class="job_id">1906 : Job ID 111b3493090640e89be9e84698075d04</span></button></div></a><div aria-labelledby="job_list___sub_heading_1906_1" data-parent="#job_list___sub_accordion_1906" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1906_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=52" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (52, 62), end pos: (52, 63)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Add, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -49,7 +49,7 @@ if public_keys_dir is None: # Default to public-keys/pki directory relative to server root server_root = Path(__file__).parent.parent - public_keys_dir = str(server_root / "public-keys" / "pki") + public_keys_dir = str(server_root / "public-keys" + "pki") if server_private_key is None: # Default to server_priv.asc in src directory</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T204419593140Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T204421149224Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 22.19s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1907"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1907_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1907_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1907_1"><button class="btn btn-outline-danger"><span class="job_id">1907 : Job ID 731d3048dada41268489558651ce3f8f</span></button></div></a><div aria-labelledby="job_list___sub_heading_1907_1" data-parent="#job_list___sub_accordion_1907" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1907_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=56" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (56, 59), end pos: (56, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Add, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -53,7 +53,7 @@ if server_private_key is None: # Default to server_priv.asc in src directory - server_private_key = str(Path(__file__).parent / "server_priv.asc") + server_private_key = str(Path(__file__).parent + "server_priv.asc") # Server public key path (needed for IdentityManager) server_public_key = str(Path(__file__).parent / "server_pub.asc")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.21s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1908"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1908_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1908_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1908_1"><button class="btn btn-outline-success"><span class="job_id">1908 : Job ID 6f19d311a10f47f6b616cf85a45baa25</span></button></div></a><div aria-labelledby="job_list___sub_heading_1908_1" data-parent="#job_list___sub_accordion_1908" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1908_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=59" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (59, 54), end pos: (59, 55)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Add, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -56,7 +56,7 @@ server_private_key = str(Path(__file__).parent / "server_priv.asc") # Server public key path (needed for IdentityManager) - server_public_key = str(Path(__file__).parent / "server_pub.asc") + server_public_key = str(Path(__file__).parent + "server_pub.asc") # Initialize RMAP components with correct API self.identity_manager = IdentityManager(</pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for +: 'WindowsPath' and 'str' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for +: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 15.43s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1909"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1909_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1909_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1909_1"><button class="btn btn-outline-danger"><span class="job_id">1909 : Job ID e63f5bb4bf384eb0a079e5b79ef483aa</span></button></div></a><div aria-labelledby="job_list___sub_heading_1909_1" data-parent="#job_list___sub_accordion_1909" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1909_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=110" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (110, 64), end pos: (110, 65)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Add, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -107,7 +107,7 @@ try: # Load server private key for decryption - server_private_key_path = str(Path(__file__).parent / "server_priv.asc") + server_private_key_path = str(Path(__file__).parent + "server_priv.asc") if not Path(server_private_key_path).exists(): return None </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.07s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1910"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1910_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1910_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1910_1"><button class="btn btn-outline-danger"><span class="job_id">1910 : Job ID 19dd78ccc9c84f1fa4b325330c89c534</span></button></div></a><div aria-labelledby="job_list___sub_heading_1910_1" data-parent="#job_list___sub_accordion_1910" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1910_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=52" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (52, 46), end pos: (52, 47)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Sub, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -49,7 +49,7 @@ if public_keys_dir is None: # Default to public-keys/pki directory relative to server root server_root = Path(__file__).parent.parent - public_keys_dir = str(server_root / "public-keys" / "pki") + public_keys_dir = str(server_root - "public-keys" / "pki") if server_private_key is None: # Default to server_priv.asc in src directory</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.01s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1911"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1911_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1911_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1911_1"><button class="btn btn-outline-danger"><span class="job_id">1911 : Job ID c965df3a5128479d9724e3c41e55e150</span></button></div></a><div aria-labelledby="job_list___sub_heading_1911_1" data-parent="#job_list___sub_accordion_1911" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1911_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=52" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (52, 62), end pos: (52, 63)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Sub, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -49,7 +49,7 @@ if public_keys_dir is None: # Default to public-keys/pki directory relative to server root server_root = Path(__file__).parent.parent - public_keys_dir = str(server_root / "public-keys" / "pki") + public_keys_dir = str(server_root / "public-keys" - "pki") if server_private_key is None: # Default to server_priv.asc in src directory</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.11s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1912"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1912_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1912_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1912_1"><button class="btn btn-outline-success"><span class="job_id">1912 : Job ID 341404a4ffb7432c8ac2c636ab07168a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1912_1" data-parent="#job_list___sub_accordion_1912" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1912_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=56" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (56, 59), end pos: (56, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Sub, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -53,7 +53,7 @@ if server_private_key is None: # Default to server_priv.asc in src directory - server_private_key = str(Path(__file__).parent / "server_priv.asc") + server_private_key = str(Path(__file__).parent - "server_priv.asc") # Server public key path (needed for IdentityManager) server_public_key = str(Path(__file__).parent / "server_pub.asc")</pre></div><div class="alert alert-secondary"><pre class="diff">...F.......... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:228: in open request = self._request_from_builder_args(args, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:200: in _request_from_builder_args return builder.get_request() ^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:764: in get_request return cls(self.get_environ()) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:688: in get_environ input_stream, content_length, boundary = stream_encode_multipart( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:130: in stream_encode_multipart write_binary(encoder.send_event(Data(data=chunk, more_data=True))) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:81: in write_binary return stream.write(s) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... 1 failed, 13 passed, 22 warnings in 21.80s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1913"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1913_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1913_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1913_1"><button class="btn btn-outline-success"><span class="job_id">1913 : Job ID a3289db4ca1446ed813a1bf3acba9955</span></button></div></a><div aria-labelledby="job_list___sub_heading_1913_1" data-parent="#job_list___sub_accordion_1913" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1913_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=59" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (59, 54), end pos: (59, 55)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Sub, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -56,7 +56,7 @@ server_private_key = str(Path(__file__).parent / "server_priv.asc") # Server public key path (needed for IdentityManager) - server_public_key = str(Path(__file__).parent / "server_pub.asc") + server_public_key = str(Path(__file__).parent - "server_pub.asc") # Initialize RMAP components with correct API self.identity_manager = IdentityManager(</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFFFF [100%]</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1914"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1914_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1914_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1914_1"><button class="btn btn-outline-danger"><span class="job_id">1914 : Job ID 21f3361d855a407baef564d8fdcab045</span></button></div></a><div aria-labelledby="job_list___sub_heading_1914_1" data-parent="#job_list___sub_accordion_1914" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1914_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=110" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (110, 64), end pos: (110, 65)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Sub, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -107,7 +107,7 @@ try: # Load server private key for decryption - server_private_key_path = str(Path(__file__).parent / "server_priv.asc") + server_private_key_path = str(Path(__file__).parent - "server_priv.asc") if not Path(server_private_key_path).exists(): return None </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.44s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1915"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1915_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1915_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1915_1"><button class="btn btn-outline-danger"><span class="job_id">1915 : Job ID cd3fe84bae554d6c88774ee3aefabef6</span></button></div></a><div aria-labelledby="job_list___sub_heading_1915_1" data-parent="#job_list___sub_accordion_1915" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1915_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=52" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (52, 46), end pos: (52, 47)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Mul, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -49,7 +49,7 @@ if public_keys_dir is None: # Default to public-keys/pki directory relative to server root server_root = Path(__file__).parent.parent - public_keys_dir = str(server_root / "public-keys" / "pki") + public_keys_dir = str(server_root * "public-keys" / "pki") if server_private_key is None: # Default to server_priv.asc in src directory</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.87s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1916"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1916_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1916_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1916_1"><button class="btn btn-outline-danger"><span class="job_id">1916 : Job ID 4bab001f26594ae2b56022ad80138033</span></button></div></a><div aria-labelledby="job_list___sub_heading_1916_1" data-parent="#job_list___sub_accordion_1916" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1916_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=52" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (52, 62), end pos: (52, 63)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Mul, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -49,7 +49,7 @@ if public_keys_dir is None: # Default to public-keys/pki directory relative to server root server_root = Path(__file__).parent.parent - public_keys_dir = str(server_root / "public-keys" / "pki") + public_keys_dir = str(server_root / "public-keys" * "pki") if server_private_key is None: # Default to server_priv.asc in src directory</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.37s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1917"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1917_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1917_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1917_1"><button class="btn btn-outline-danger"><span class="job_id">1917 : Job ID 704e1308f47146d480628a9e97fe1dbe</span></button></div></a><div aria-labelledby="job_list___sub_heading_1917_1" data-parent="#job_list___sub_accordion_1917" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1917_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=56" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (56, 59), end pos: (56, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Mul, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -53,7 +53,7 @@ if server_private_key is None: # Default to server_priv.asc in src directory - server_private_key = str(Path(__file__).parent / "server_priv.asc") + server_private_key = str(Path(__file__).parent * "server_priv.asc") # Server public key path (needed for IdentityManager) server_public_key = str(Path(__file__).parent / "server_pub.asc")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.62s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1918"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1918_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1918_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1918_1"><button class="btn btn-outline-success"><span class="job_id">1918 : Job ID 273c1e1290dc41f5ace1c3246de803fc</span></button></div></a><div aria-labelledby="job_list___sub_heading_1918_1" data-parent="#job_list___sub_accordion_1918" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1918_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=59" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (59, 54), end pos: (59, 55)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Mul, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -56,7 +56,7 @@ server_private_key = str(Path(__file__).parent / "server_priv.asc") # Server public key path (needed for IdentityManager) - server_public_key = str(Path(__file__).parent / "server_pub.asc") + server_public_key = str(Path(__file__).parent * "server_pub.asc") # Initialize RMAP components with correct API self.identity_manager = IdentityManager(</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFFFF [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): can't multiply sequence by non-int of type 'WindowsPath' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): can't multiply sequence by non-int of type 'WindowsPath' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): can't multiply sequence by non-int of type 'WindowsPath' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T052017934655Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): can't multiply sequence by non-int of type 'WindowsPath' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): can't multiply sequence by non-int of type 'WindowsPath' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): can't multiply sequence by non-int of type 'WindowsPath' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): can't multiply sequence by non-int of type 'WindowsPath' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): can't multiply sequence by non-int of type 'WindowsPath' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): can't multiply sequence by non-int of type 'WindowsPath' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T052018164950Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): can't multiply sequence by non-int of type 'WindowsPath' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): can't multiply sequence by non-int of type 'WindowsPath' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): can't multiply sequence by non-int of type 'WindowsPath' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 12 failed, 2 passed, 9 warnings in 14.09s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1919"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1919_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1919_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1919_1"><button class="btn btn-outline-danger"><span class="job_id">1919 : Job ID cc685b885dec41b4ad297a6d8229f5bd</span></button></div></a><div aria-labelledby="job_list___sub_heading_1919_1" data-parent="#job_list___sub_accordion_1919" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1919_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=110" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (110, 64), end pos: (110, 65)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Mul, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -107,7 +107,7 @@ try: # Load server private key for decryption - server_private_key_path = str(Path(__file__).parent / "server_priv.asc") + server_private_key_path = str(Path(__file__).parent * "server_priv.asc") if not Path(server_private_key_path).exists(): return None </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.40s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1920"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1920_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1920_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1920_1"><button class="btn btn-outline-success"><span class="job_id">1920 : Job ID f3dd2bb1257a4f1ab80c5b5d7cb2428b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1920_1" data-parent="#job_list___sub_accordion_1920" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1920_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=52" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (52, 46), end pos: (52, 47)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_FloorDiv, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -49,7 +49,7 @@ if public_keys_dir is None: # Default to public-keys/pki directory relative to server root server_root = Path(__file__).parent.parent - public_keys_dir = str(server_root / "public-keys" / "pki") + public_keys_dir = str(server_root // "public-keys" / "pki") if server_private_key is None: # Default to server_priv.asc in src directory</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T035918804178Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T035919715544Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.65s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1921"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1921_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1921_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1921_1"><button class="btn btn-outline-danger"><span class="job_id">1921 : Job ID db8fd934ebba4afeba85d708d3b048fb</span></button></div></a><div aria-labelledby="job_list___sub_heading_1921_1" data-parent="#job_list___sub_accordion_1921" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1921_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=52" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (52, 62), end pos: (52, 63)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_FloorDiv, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -49,7 +49,7 @@ if public_keys_dir is None: # Default to public-keys/pki directory relative to server root server_root = Path(__file__).parent.parent - public_keys_dir = str(server_root / "public-keys" / "pki") + public_keys_dir = str(server_root / "public-keys" // "pki") if server_private_key is None: # Default to server_priv.asc in src directory</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.24s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1922"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1922_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1922_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1922_1"><button class="btn btn-outline-danger"><span class="job_id">1922 : Job ID 1c0bf7fa096046df935772cd97408f10</span></button></div></a><div aria-labelledby="job_list___sub_heading_1922_1" data-parent="#job_list___sub_accordion_1922" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1922_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=56" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (56, 59), end pos: (56, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_FloorDiv, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -53,7 +53,7 @@ if server_private_key is None: # Default to server_priv.asc in src directory - server_private_key = str(Path(__file__).parent / "server_priv.asc") + server_private_key = str(Path(__file__).parent // "server_priv.asc") # Server public key path (needed for IdentityManager) server_public_key = str(Path(__file__).parent / "server_pub.asc")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.35s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1923"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1923_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1923_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1923_1"><button class="btn btn-outline-success"><span class="job_id">1923 : Job ID d7cc02ebee34482c9b1be2cb3600e219</span></button></div></a><div aria-labelledby="job_list___sub_heading_1923_1" data-parent="#job_list___sub_accordion_1923" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1923_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=59" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (59, 54), end pos: (59, 55)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_FloorDiv, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -56,7 +56,7 @@ server_private_key = str(Path(__file__).parent / "server_priv.asc") # Server public key path (needed for IdentityManager) - server_public_key = str(Path(__file__).parent / "server_pub.asc") + server_public_key = str(Path(__file__).parent // "server_pub.asc") # Initialize RMAP components with correct API self.identity_manager = IdentityManager(</pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for //: 'WindowsPath' and 'str' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for //: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 15.15s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1924"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1924_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1924_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1924_1"><button class="btn btn-outline-danger"><span class="job_id">1924 : Job ID 1bd8212f728b41a899f9f15f02794dbe</span></button></div></a><div aria-labelledby="job_list___sub_heading_1924_1" data-parent="#job_list___sub_accordion_1924" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1924_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=110" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (110, 64), end pos: (110, 65)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_FloorDiv, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -107,7 +107,7 @@ try: # Load server private key for decryption - server_private_key_path = str(Path(__file__).parent / "server_priv.asc") + server_private_key_path = str(Path(__file__).parent // "server_priv.asc") if not Path(server_private_key_path).exists(): return None </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.51s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1925"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1925_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1925_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1925_1"><button class="btn btn-outline-danger"><span class="job_id">1925 : Job ID 9991ff9cb97d49769fcf9b1b76d95c37</span></button></div></a><div aria-labelledby="job_list___sub_heading_1925_1" data-parent="#job_list___sub_accordion_1925" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1925_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=52" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (52, 46), end pos: (52, 47)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Mod, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -49,7 +49,7 @@ if public_keys_dir is None: # Default to public-keys/pki directory relative to server root server_root = Path(__file__).parent.parent - public_keys_dir = str(server_root / "public-keys" / "pki") + public_keys_dir = str(server_root % "public-keys" / "pki") if server_private_key is None: # Default to server_priv.asc in src directory</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.75s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1926"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1926_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1926_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1926_1"><button class="btn btn-outline-danger"><span class="job_id">1926 : Job ID ef174d5521654ad39aec736deffa85ec</span></button></div></a><div aria-labelledby="job_list___sub_heading_1926_1" data-parent="#job_list___sub_accordion_1926" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1926_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=52" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (52, 62), end pos: (52, 63)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Mod, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -49,7 +49,7 @@ if public_keys_dir is None: # Default to public-keys/pki directory relative to server root server_root = Path(__file__).parent.parent - public_keys_dir = str(server_root / "public-keys" / "pki") + public_keys_dir = str(server_root / "public-keys" % "pki") if server_private_key is None: # Default to server_priv.asc in src directory</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.30s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1927"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1927_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1927_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1927_1"><button class="btn btn-outline-success"><span class="job_id">1927 : Job ID dd354ce9f6d04aafa9ef57ad9b25afee</span></button></div></a><div aria-labelledby="job_list___sub_heading_1927_1" data-parent="#job_list___sub_accordion_1927" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1927_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=56" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (56, 59), end pos: (56, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Mod, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -53,7 +53,7 @@ if server_private_key is None: # Default to server_priv.asc in src directory - server_private_key = str(Path(__file__).parent / "server_priv.asc") + server_private_key = str(Path(__file__).parent % "server_priv.asc") # Server public key path (needed for IdentityManager) server_public_key = str(Path(__file__).parent / "server_pub.asc")</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614eac99b232e76a61c6: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.95s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1928"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1928_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1928_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1928_1"><button class="btn btn-outline-success"><span class="job_id">1928 : Job ID 91914d4c345047bfac10e5198ab3154f</span></button></div></a><div aria-labelledby="job_list___sub_heading_1928_1" data-parent="#job_list___sub_accordion_1928" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1928_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=59" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (59, 54), end pos: (59, 55)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Mod, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -56,7 +56,7 @@ server_private_key = str(Path(__file__).parent / "server_priv.asc") # Server public key path (needed for IdentityManager) - server_public_key = str(Path(__file__).parent / "server_pub.asc") + server_public_key = str(Path(__file__).parent % "server_pub.asc") # Initialize RMAP components with correct API self.identity_manager = IdentityManager(</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFFFF [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for %: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for %: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for %: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T212058788194Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for %: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for %: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for %: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for %: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for %: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for %: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T212059051307Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for %: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for %: 'WindowsPath' and 'str' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for %: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 12 failed, 2 passed, 9 warnings in 13.78s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1929"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1929_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1929_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1929_1"><button class="btn btn-outline-success"><span class="job_id">1929 : Job ID d8313b4cf3054a73bf2a84123cd24bea</span></button></div></a><div aria-labelledby="job_list___sub_heading_1929_1" data-parent="#job_list___sub_accordion_1929" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1929_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=110" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (110, 64), end pos: (110, 65)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Mod, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -107,7 +107,7 @@ try: # Load server private key for decryption - server_private_key_path = str(Path(__file__).parent / "server_priv.asc") + server_private_key_path = str(Path(__file__).parent % "server_priv.asc") if not Path(server_private_key_path).exists(): return None </pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614eaff3c5463b09bb4a: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.68s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1930"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1930_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1930_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1930_1"><button class="btn btn-outline-danger"><span class="job_id">1930 : Job ID 024387d3ab5b4b9db80c0190ff8e906b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1930_1" data-parent="#job_list___sub_accordion_1930" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1930_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=52" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (52, 46), end pos: (52, 47)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Pow, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -49,7 +49,7 @@ if public_keys_dir is None: # Default to public-keys/pki directory relative to server root server_root = Path(__file__).parent.parent - public_keys_dir = str(server_root / "public-keys" / "pki") + public_keys_dir = str(server_root ** "public-keys" / "pki") if server_private_key is None: # Default to server_priv.asc in src directory</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.59s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1931"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1931_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1931_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1931_1"><button class="btn btn-outline-success"><span class="job_id">1931 : Job ID db7e995933d64ddc86151693ff9f05f5</span></button></div></a><div aria-labelledby="job_list___sub_heading_1931_1" data-parent="#job_list___sub_accordion_1931" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1931_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=52" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (52, 62), end pos: (52, 63)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Pow, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -49,7 +49,7 @@ if public_keys_dir is None: # Default to public-keys/pki directory relative to server root server_root = Path(__file__).parent.parent - public_keys_dir = str(server_root / "public-keys" / "pki") + public_keys_dir = str(server_root / "public-keys" ** "pki") if server_private_key is None: # Default to server_priv.asc in src directory</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T042840321266Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T042841330916Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 21.23s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1932"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1932_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1932_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1932_1"><button class="btn btn-outline-danger"><span class="job_id">1932 : Job ID f98ec529df1e44f68cbc11d5f14a3b0c</span></button></div></a><div aria-labelledby="job_list___sub_heading_1932_1" data-parent="#job_list___sub_accordion_1932" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1932_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=56" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (56, 59), end pos: (56, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Pow, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -53,7 +53,7 @@ if server_private_key is None: # Default to server_priv.asc in src directory - server_private_key = str(Path(__file__).parent / "server_priv.asc") + server_private_key = str(Path(__file__).parent ** "server_priv.asc") # Server public key path (needed for IdentityManager) server_public_key = str(Path(__file__).parent / "server_pub.asc")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.64s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1933"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1933_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1933_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1933_1"><button class="btn btn-outline-success"><span class="job_id">1933 : Job ID 68b1d77b756e478e9d829c09932f831a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1933_1" data-parent="#job_list___sub_accordion_1933" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1933_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=59" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (59, 54), end pos: (59, 55)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Pow, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -56,7 +56,7 @@ server_private_key = str(Path(__file__).parent / "server_priv.asc") # Server public key path (needed for IdentityManager) - server_public_key = str(Path(__file__).parent / "server_pub.asc") + server_public_key = str(Path(__file__).parent ** "server_pub.asc") # Initialize RMAP components with correct API self.identity_manager = IdentityManager(</pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for ** or pow(): 'WindowsPath' and 'str' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for ** or pow(): 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 15.25s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1934"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1934_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1934_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1934_1"><button class="btn btn-outline-danger"><span class="job_id">1934 : Job ID f6209134512349edae556256ee57a045</span></button></div></a><div aria-labelledby="job_list___sub_heading_1934_1" data-parent="#job_list___sub_accordion_1934" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1934_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=110" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (110, 64), end pos: (110, 65)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_Pow, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -107,7 +107,7 @@ try: # Load server private key for decryption - server_private_key_path = str(Path(__file__).parent / "server_priv.asc") + server_private_key_path = str(Path(__file__).parent ** "server_priv.asc") if not Path(server_private_key_path).exists(): return None </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.20s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1935"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1935_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1935_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1935_1"><button class="btn btn-outline-danger"><span class="job_id">1935 : Job ID 9d82d1a3548b472f9c3293519dd133a1</span></button></div></a><div aria-labelledby="job_list___sub_heading_1935_1" data-parent="#job_list___sub_accordion_1935" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1935_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=52" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (52, 46), end pos: (52, 47)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_RShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -49,7 +49,7 @@ if public_keys_dir is None: # Default to public-keys/pki directory relative to server root server_root = Path(__file__).parent.parent - public_keys_dir = str(server_root / "public-keys" / "pki") + public_keys_dir = str(server_root &gt;&gt; "public-keys" / "pki") if server_private_key is None: # Default to server_priv.asc in src directory</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.80s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1936"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1936_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1936_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1936_1"><button class="btn btn-outline-danger"><span class="job_id">1936 : Job ID c52fbabdb09546389a64a78c6302386e</span></button></div></a><div aria-labelledby="job_list___sub_heading_1936_1" data-parent="#job_list___sub_accordion_1936" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1936_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=52" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (52, 62), end pos: (52, 63)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_RShift, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -49,7 +49,7 @@ if public_keys_dir is None: # Default to public-keys/pki directory relative to server root server_root = Path(__file__).parent.parent - public_keys_dir = str(server_root / "public-keys" / "pki") + public_keys_dir = str(server_root / "public-keys" &gt;&gt; "pki") if server_private_key is None: # Default to server_priv.asc in src directory</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.56s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1937"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1937_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1937_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1937_1"><button class="btn btn-outline-danger"><span class="job_id">1937 : Job ID d748b8b06d2c474590dc6947a15fa796</span></button></div></a><div aria-labelledby="job_list___sub_heading_1937_1" data-parent="#job_list___sub_accordion_1937" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1937_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=56" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (56, 59), end pos: (56, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_RShift, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -53,7 +53,7 @@ if server_private_key is None: # Default to server_priv.asc in src directory - server_private_key = str(Path(__file__).parent / "server_priv.asc") + server_private_key = str(Path(__file__).parent &gt;&gt; "server_priv.asc") # Server public key path (needed for IdentityManager) server_public_key = str(Path(__file__).parent / "server_pub.asc")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.62s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1938"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1938_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1938_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1938_1"><button class="btn btn-outline-success"><span class="job_id">1938 : Job ID dd5608b4f68a4fae95d3fe0af34bfdf9</span></button></div></a><div aria-labelledby="job_list___sub_heading_1938_1" data-parent="#job_list___sub_accordion_1938" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1938_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=59" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (59, 54), end pos: (59, 55)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_RShift, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -56,7 +56,7 @@ server_private_key = str(Path(__file__).parent / "server_priv.asc") # Server public key path (needed for IdentityManager) - server_public_key = str(Path(__file__).parent / "server_pub.asc") + server_public_key = str(Path(__file__).parent &gt;&gt; "server_pub.asc") # Initialize RMAP components with correct API self.identity_manager = IdentityManager(</pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for &gt;&gt;: 'WindowsPath' and 'str' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for &gt;&gt;: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 15.02s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1939"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1939_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1939_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1939_1"><button class="btn btn-outline-success"><span class="job_id">1939 : Job ID 03a5ab98d90a435481cde739aed0363d</span></button></div></a><div aria-labelledby="job_list___sub_heading_1939_1" data-parent="#job_list___sub_accordion_1939" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1939_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=110" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (110, 64), end pos: (110, 65)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_RShift, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -107,7 +107,7 @@ try: # Load server private key for decryption - server_private_key_path = str(Path(__file__).parent / "server_priv.asc") + server_private_key_path = str(Path(__file__).parent &gt;&gt; "server_priv.asc") if not Path(server_private_key_path).exists(): return None </pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e8367a1d17a67234f: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.71s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1940"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1940_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1940_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1940_1"><button class="btn btn-outline-danger"><span class="job_id">1940 : Job ID 6b020da57c3e4736b0bde759907b2740</span></button></div></a><div aria-labelledby="job_list___sub_heading_1940_1" data-parent="#job_list___sub_accordion_1940" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1940_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=52" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (52, 46), end pos: (52, 47)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_LShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -49,7 +49,7 @@ if public_keys_dir is None: # Default to public-keys/pki directory relative to server root server_root = Path(__file__).parent.parent - public_keys_dir = str(server_root / "public-keys" / "pki") + public_keys_dir = str(server_root &lt;&lt; "public-keys" / "pki") if server_private_key is None: # Default to server_priv.asc in src directory</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.82s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1941"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1941_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1941_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1941_1"><button class="btn btn-outline-danger"><span class="job_id">1941 : Job ID af44f3172dcb4bf9b2ab3d7f1dedc408</span></button></div></a><div aria-labelledby="job_list___sub_heading_1941_1" data-parent="#job_list___sub_accordion_1941" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1941_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=52" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (52, 62), end pos: (52, 63)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_LShift, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -49,7 +49,7 @@ if public_keys_dir is None: # Default to public-keys/pki directory relative to server root server_root = Path(__file__).parent.parent - public_keys_dir = str(server_root / "public-keys" / "pki") + public_keys_dir = str(server_root / "public-keys" &lt;&lt; "pki") if server_private_key is None: # Default to server_priv.asc in src directory</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.95s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1942"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1942_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1942_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1942_1"><button class="btn btn-outline-danger"><span class="job_id">1942 : Job ID 8fd4a627e37e4065b260b6f37ebed3f2</span></button></div></a><div aria-labelledby="job_list___sub_heading_1942_1" data-parent="#job_list___sub_accordion_1942" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1942_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=56" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (56, 59), end pos: (56, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_LShift, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -53,7 +53,7 @@ if server_private_key is None: # Default to server_priv.asc in src directory - server_private_key = str(Path(__file__).parent / "server_priv.asc") + server_private_key = str(Path(__file__).parent &lt;&lt; "server_priv.asc") # Server public key path (needed for IdentityManager) server_public_key = str(Path(__file__).parent / "server_pub.asc")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.13s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1943"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1943_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1943_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1943_1"><button class="btn btn-outline-success"><span class="job_id">1943 : Job ID 90390b4e8dc941718d9c2be676017616</span></button></div></a><div aria-labelledby="job_list___sub_heading_1943_1" data-parent="#job_list___sub_accordion_1943" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1943_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=59" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (59, 54), end pos: (59, 55)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_LShift, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -56,7 +56,7 @@ server_private_key = str(Path(__file__).parent / "server_priv.asc") # Server public key path (needed for IdentityManager) - server_public_key = str(Path(__file__).parent / "server_pub.asc") + server_public_key = str(Path(__file__).parent &lt;&lt; "server_pub.asc") # Initialize RMAP components with correct API self.identity_manager = IdentityManager(</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFFFF [100%]</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1944"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1944_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1944_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1944_1"><button class="btn btn-outline-success"><span class="job_id">1944 : Job ID 7ede2ed799624835a8c474701a11c511</span></button></div></a><div aria-labelledby="job_list___sub_heading_1944_1" data-parent="#job_list___sub_accordion_1944" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1944_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=110" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (110, 64), end pos: (110, 65)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_LShift, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -107,7 +107,7 @@ try: # Load server private key for decryption - server_private_key_path = str(Path(__file__).parent / "server_priv.asc") + server_private_key_path = str(Path(__file__).parent &lt;&lt; "server_priv.asc") if not Path(server_private_key_path).exists(): return None </pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T161629641512Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T161630580974Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.24s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1945"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1945_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1945_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1945_1"><button class="btn btn-outline-danger"><span class="job_id">1945 : Job ID 475486f8d2bc41a5a59d34274acc3719</span></button></div></a><div aria-labelledby="job_list___sub_heading_1945_1" data-parent="#job_list___sub_accordion_1945" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1945_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=52" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (52, 46), end pos: (52, 47)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitOr, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -49,7 +49,7 @@ if public_keys_dir is None: # Default to public-keys/pki directory relative to server root server_root = Path(__file__).parent.parent - public_keys_dir = str(server_root / "public-keys" / "pki") + public_keys_dir = str(server_root | "public-keys" / "pki") if server_private_key is None: # Default to server_priv.asc in src directory</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.22s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1946"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1946_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1946_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1946_1"><button class="btn btn-outline-danger"><span class="job_id">1946 : Job ID 5e6de9b6fe5b494b9d0eebb30353aa26</span></button></div></a><div aria-labelledby="job_list___sub_heading_1946_1" data-parent="#job_list___sub_accordion_1946" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1946_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=52" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (52, 62), end pos: (52, 63)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitOr, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -49,7 +49,7 @@ if public_keys_dir is None: # Default to public-keys/pki directory relative to server root server_root = Path(__file__).parent.parent - public_keys_dir = str(server_root / "public-keys" / "pki") + public_keys_dir = str(server_root / "public-keys" | "pki") if server_private_key is None: # Default to server_priv.asc in src directory</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.07s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1947"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1947_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1947_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1947_1"><button class="btn btn-outline-danger"><span class="job_id">1947 : Job ID f0b0bcde167d4e80b31b3a0df5bf45c7</span></button></div></a><div aria-labelledby="job_list___sub_heading_1947_1" data-parent="#job_list___sub_accordion_1947" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1947_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=56" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (56, 59), end pos: (56, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitOr, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -53,7 +53,7 @@ if server_private_key is None: # Default to server_priv.asc in src directory - server_private_key = str(Path(__file__).parent / "server_priv.asc") + server_private_key = str(Path(__file__).parent | "server_priv.asc") # Server public key path (needed for IdentityManager) server_public_key = str(Path(__file__).parent / "server_pub.asc")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.34s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1948"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1948_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1948_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1948_1"><button class="btn btn-outline-success"><span class="job_id">1948 : Job ID 5ed9774492e242a3a6daa9ce8f6e6fb0</span></button></div></a><div aria-labelledby="job_list___sub_heading_1948_1" data-parent="#job_list___sub_accordion_1948" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1948_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=59" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (59, 54), end pos: (59, 55)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitOr, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -56,7 +56,7 @@ server_private_key = str(Path(__file__).parent / "server_priv.asc") # Server public key path (needed for IdentityManager) - server_public_key = str(Path(__file__).parent / "server_pub.asc") + server_public_key = str(Path(__file__).parent | "server_pub.asc") # Initialize RMAP components with correct API self.identity_manager = IdentityManager(</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFFFF [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for |: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for |: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for |: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T172152142393Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for |: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for |: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for |: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for |: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for |: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for |: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T172152368724Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for |: 'WindowsPath' and 'str' ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for |: 'WindowsPath' and 'str' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for |: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 12 failed, 2 passed, 9 warnings in 13.79s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1949"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1949_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1949_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1949_1"><button class="btn btn-outline-success"><span class="job_id">1949 : Job ID 3380676d56b04b09be727fa9ca79d407</span></button></div></a><div aria-labelledby="job_list___sub_heading_1949_1" data-parent="#job_list___sub_accordion_1949" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1949_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=110" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (110, 64), end pos: (110, 65)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitOr, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -107,7 +107,7 @@ try: # Load server private key for decryption - server_private_key_path = str(Path(__file__).parent / "server_priv.asc") + server_private_key_path = str(Path(__file__).parent | "server_priv.asc") if not Path(server_private_key_path).exists(): return None </pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T014744996307Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T014745982281Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.61s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1950"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1950_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1950_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1950_1"><button class="btn btn-outline-danger"><span class="job_id">1950 : Job ID 43d407696cbf49869a9f760e86dec44c</span></button></div></a><div aria-labelledby="job_list___sub_heading_1950_1" data-parent="#job_list___sub_accordion_1950" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1950_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=52" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (52, 46), end pos: (52, 47)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitAnd, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -49,7 +49,7 @@ if public_keys_dir is None: # Default to public-keys/pki directory relative to server root server_root = Path(__file__).parent.parent - public_keys_dir = str(server_root / "public-keys" / "pki") + public_keys_dir = str(server_root &amp; "public-keys" / "pki") if server_private_key is None: # Default to server_priv.asc in src directory</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.57s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1951"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1951_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1951_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1951_1"><button class="btn btn-outline-danger"><span class="job_id">1951 : Job ID ec36a1e96eba472183a88d36e6417cf7</span></button></div></a><div aria-labelledby="job_list___sub_heading_1951_1" data-parent="#job_list___sub_accordion_1951" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1951_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=52" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (52, 62), end pos: (52, 63)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitAnd, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -49,7 +49,7 @@ if public_keys_dir is None: # Default to public-keys/pki directory relative to server root server_root = Path(__file__).parent.parent - public_keys_dir = str(server_root / "public-keys" / "pki") + public_keys_dir = str(server_root / "public-keys" &amp; "pki") if server_private_key is None: # Default to server_priv.asc in src directory</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.21s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1952"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1952_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1952_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1952_1"><button class="btn btn-outline-danger"><span class="job_id">1952 : Job ID ca1f45c3f22a46e7883f0ddaf946f393</span></button></div></a><div aria-labelledby="job_list___sub_heading_1952_1" data-parent="#job_list___sub_accordion_1952" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1952_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=56" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (56, 59), end pos: (56, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitAnd, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -53,7 +53,7 @@ if server_private_key is None: # Default to server_priv.asc in src directory - server_private_key = str(Path(__file__).parent / "server_priv.asc") + server_private_key = str(Path(__file__).parent &amp; "server_priv.asc") # Server public key path (needed for IdentityManager) server_public_key = str(Path(__file__).parent / "server_pub.asc")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.49s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1953"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1953_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1953_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1953_1"><button class="btn btn-outline-success"><span class="job_id">1953 : Job ID 89c080a8a8b24a49895b6d0a63eb9201</span></button></div></a><div aria-labelledby="job_list___sub_heading_1953_1" data-parent="#job_list___sub_accordion_1953" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1953_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=59" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (59, 54), end pos: (59, 55)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitAnd, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -56,7 +56,7 @@ server_private_key = str(Path(__file__).parent / "server_priv.asc") # Server public key path (needed for IdentityManager) - server_public_key = str(Path(__file__).parent / "server_pub.asc") + server_public_key = str(Path(__file__).parent &amp; "server_pub.asc") # Initialize RMAP components with correct API self.identity_manager = IdentityManager(</pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for &amp;: 'WindowsPath' and 'str' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for &amp;: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 14.87s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1954"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1954_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1954_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1954_1"><button class="btn btn-outline-danger"><span class="job_id">1954 : Job ID fc7934d145044381852c208d847443e5</span></button></div></a><div aria-labelledby="job_list___sub_heading_1954_1" data-parent="#job_list___sub_accordion_1954" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1954_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=110" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (110, 64), end pos: (110, 65)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitAnd, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -107,7 +107,7 @@ try: # Load server private key for decryption - server_private_key_path = str(Path(__file__).parent / "server_priv.asc") + server_private_key_path = str(Path(__file__).parent &amp; "server_priv.asc") if not Path(server_private_key_path).exists(): return None </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.11s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1955"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1955_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1955_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1955_1"><button class="btn btn-outline-danger"><span class="job_id">1955 : Job ID f482f8bcac9249469364596825491dca</span></button></div></a><div aria-labelledby="job_list___sub_heading_1955_1" data-parent="#job_list___sub_accordion_1955" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1955_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=52" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (52, 46), end pos: (52, 47)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitXor, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -49,7 +49,7 @@ if public_keys_dir is None: # Default to public-keys/pki directory relative to server root server_root = Path(__file__).parent.parent - public_keys_dir = str(server_root / "public-keys" / "pki") + public_keys_dir = str(server_root ^ "public-keys" / "pki") if server_private_key is None: # Default to server_priv.asc in src directory</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.44s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1956"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1956_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1956_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1956_1"><button class="btn btn-outline-danger"><span class="job_id">1956 : Job ID bbc2a15478b347568419346a11f6bd4b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1956_1" data-parent="#job_list___sub_accordion_1956" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1956_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=52" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (52, 62), end pos: (52, 63)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitXor, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -49,7 +49,7 @@ if public_keys_dir is None: # Default to public-keys/pki directory relative to server root server_root = Path(__file__).parent.parent - public_keys_dir = str(server_root / "public-keys" / "pki") + public_keys_dir = str(server_root / "public-keys" ^ "pki") if server_private_key is None: # Default to server_priv.asc in src directory</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.18s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1957"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1957_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1957_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1957_1"><button class="btn btn-outline-success"><span class="job_id">1957 : Job ID bd041c4017d049bebb1149c3180f2c8f</span></button></div></a><div aria-labelledby="job_list___sub_heading_1957_1" data-parent="#job_list___sub_accordion_1957" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1957_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=56" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (56, 59), end pos: (56, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitXor, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -53,7 +53,7 @@ if server_private_key is None: # Default to server_priv.asc in src directory - server_private_key = str(Path(__file__).parent / "server_priv.asc") + server_private_key = str(Path(__file__).parent ^ "server_priv.asc") # Server public key path (needed for IdentityManager) server_public_key = str(Path(__file__).parent / "server_pub.asc")</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614efed1548f19e1dc37: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 22.41s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1958"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1958_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1958_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1958_1"><button class="btn btn-outline-success"><span class="job_id">1958 : Job ID 3eeb82a4f2754ba2a33ffa1ed5e236aa</span></button></div></a><div aria-labelledby="job_list___sub_heading_1958_1" data-parent="#job_list___sub_accordion_1958" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1958_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=59" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (59, 54), end pos: (59, 55)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitXor, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -56,7 +56,7 @@ server_private_key = str(Path(__file__).parent / "server_priv.asc") # Server public key path (needed for IdentityManager) - server_public_key = str(Path(__file__).parent / "server_pub.asc") + server_public_key = str(Path(__file__).parent ^ "server_pub.asc") # Initialize RMAP components with correct API self.identity_manager = IdentityManager(</pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for ^: 'WindowsPath' and 'str' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ----------------------------- Captured log setup ------------------------------ WARNING server:server.py:88 RMAP initialization failed (continuing): unsupported operand type(s) for ^: 'WindowsPath' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 15.30s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1959"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1959_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1959_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_1959_1"><button class="btn btn-outline-danger"><span class="job_id">1959 : Job ID 7cdbfe84e7d14197ab97becd47d63d9d</span></button></div></a><div aria-labelledby="job_list___sub_heading_1959_1" data-parent="#job_list___sub_accordion_1959" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1959_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=110" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (110, 64), end pos: (110, 65)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Div_BitXor, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -107,7 +107,7 @@ try: # Load server private key for decryption - server_private_key_path = str(Path(__file__).parent / "server_priv.asc") + server_private_key_path = str(Path(__file__).parent ^ "server_priv.asc") if not Path(server_private_key_path).exists(): return None </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.96s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1960"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1960_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1960_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1960_1"><button class="btn btn-outline-success"><span class="job_id">1960 : Job ID bc69f456f9df41cdb5bb1544d34e41c0</span></button></div></a><div aria-labelledby="job_list___sub_heading_1960_1" data-parent="#job_list___sub_accordion_1960" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1960_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=34" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (34, 29), end pos: (34, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -31,7 +31,7 @@ def __init__( self, storage_dir: str, - public_keys_dir: str | None = None, + public_keys_dir: str + None = None, server_private_key: str | None = None, ): self.storage_dir = storage_dir</pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 14.84s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1961"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1961_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1961_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1961_1"><button class="btn btn-outline-success"><span class="job_id">1961 : Job ID 208c52588cb342699a687a3f007ad049</span></button></div></a><div aria-labelledby="job_list___sub_heading_1961_1" data-parent="#job_list___sub_accordion_1961" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1961_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=35" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (35, 32), end pos: (35, 33)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -32,7 +32,7 @@ self, storage_dir: str, public_keys_dir: str | None = None, - server_private_key: str | None = None, + server_private_key: str + None = None, ): self.storage_dir = storage_dir self.watermarked_pdfs: dict[</pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 15.34s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1962"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1962_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1962_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1962_1"><button class="btn btn-outline-success"><span class="job_id">1962 : Job ID 67cd747b02e342b893f3f511fcd29c82</span></button></div></a><div aria-labelledby="job_list___sub_heading_1962_1" data-parent="#job_list___sub_accordion_1962" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1962_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=100" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (100, 72), end pos: (100, 73)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -97,7 +97,7 @@ except Exception as e: return {"error": f"RMAP processing error: {str(e)}"} - def _decrypt_message1_payload(self, payload: str) -&gt; dict[str, Any] | None: + def _decrypt_message1_payload(self, payload: str) -&gt; dict[str, Any] + None: """ Decrypt message 1 payload to extract identity and nonce_client. This allows us to capture the identity before passing to RMAP library.</pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 15.08s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1963"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1963_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1963_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1963_1"><button class="btn btn-outline-success"><span class="job_id">1963 : Job ID 8ba30cdf24c8467baa84f92899d110fd</span></button></div></a><div aria-labelledby="job_list___sub_heading_1963_1" data-parent="#job_list___sub_accordion_1963" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1963_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=190" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (190, 69), end pos: (190, 70)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -187,7 +187,7 @@ except Exception as e: return {"error": f"RMAP processing error: {str(e)}"} - def _find_identity_for_session(self, session_secret: str) -&gt; str | None: + def _find_identity_for_session(self, session_secret: str) -&gt; str + None: """ Try to find the identity that corresponds to this session secret. This implements correlation between Message 1 and Message 2.</pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 15.29s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1964"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1964_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1964_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1964_1"><button class="btn btn-outline-success"><span class="job_id">1964 : Job ID 24949458c520402c9c775b7b60310956</span></button></div></a><div aria-labelledby="job_list___sub_heading_1964_1" data-parent="#job_list___sub_accordion_1964" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1964_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=207" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (207, 78), end pos: (207, 79)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -204,7 +204,7 @@ # Default fallback - better than hardcoded "RMAP_CLIENT" return "Unknown_Group" - def get_watermarked_pdf_info(self, session_secret: str) -&gt; dict[str, Any] | None: + def get_watermarked_pdf_info(self, session_secret: str) -&gt; dict[str, Any] + None: """Get watermarked PDF metadata for a session secret.""" return self.watermarked_pdfs.get(session_secret) </pre></div><div class="alert alert-secondary"><pre class="diff">...F........FF [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:228: in open request = self._request_from_builder_args(args, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:200: in _request_from_builder_args return builder.get_request() ^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:764: in get_request return cls(self.get_environ()) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:688: in get_environ input_stream, content_length, boundary = stream_encode_multipart( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:130: in stream_encode_multipart write_binary(encoder.send_event(Data(data=chunk, more_data=True))) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:81: in write_binary return stream.write(s) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 3 failed, 11 passed, 9 warnings in 15.17s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1965"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1965_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1965_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1965_1"><button class="btn btn-outline-success"><span class="job_id">1965 : Job ID da662bbf35ed47ab96240142b3331ce0</span></button></div></a><div aria-labelledby="job_list___sub_heading_1965_1" data-parent="#job_list___sub_accordion_1965" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1965_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=211" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (211, 63), end pos: (211, 64)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -208,7 +208,7 @@ """Get watermarked PDF metadata for a session secret.""" return self.watermarked_pdfs.get(session_secret) - def get_session_identity(self, session_secret: str) -&gt; str | None: + def get_session_identity(self, session_secret: str) -&gt; str + None: """Get the identity (group name) for a session secret.""" return self.session_identities.get(session_secret) </pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 14.96s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1966"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1966_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1966_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1966_1"><button class="btn btn-outline-success"><span class="job_id">1966 : Job ID ca239386d6fb4f69b5e822de1e81a111</span></button></div></a><div aria-labelledby="job_list___sub_heading_1966_1" data-parent="#job_list___sub_accordion_1966" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1966_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=34" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (34, 29), end pos: (34, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -31,7 +31,7 @@ def __init__( self, storage_dir: str, - public_keys_dir: str | None = None, + public_keys_dir: str - None = None, server_private_key: str | None = None, ): self.storage_dir = storage_dir</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFFFF [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 6 failed, 8 passed, 9 warnings in 14.73s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1967"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1967_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1967_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1967_1"><button class="btn btn-outline-success"><span class="job_id">1967 : Job ID bb89b3678f254b4aad7cf785a75fcd55</span></button></div></a><div aria-labelledby="job_list___sub_heading_1967_1" data-parent="#job_list___sub_accordion_1967" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1967_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=35" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (35, 32), end pos: (35, 33)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -32,7 +32,7 @@ self, storage_dir: str, public_keys_dir: str | None = None, - server_private_key: str | None = None, + server_private_key: str - None = None, ): self.storage_dir = storage_dir self.watermarked_pdfs: dict[</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFFFF [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T003340705288Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T003341078489Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 10 failed, 4 passed, 9 warnings in 14.06s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1968"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1968_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1968_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1968_1"><button class="btn btn-outline-success"><span class="job_id">1968 : Job ID 86e5b0e2e982467292c9eb1eb43152d6</span></button></div></a><div aria-labelledby="job_list___sub_heading_1968_1" data-parent="#job_list___sub_accordion_1968" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1968_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=100" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (100, 72), end pos: (100, 73)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -97,7 +97,7 @@ except Exception as e: return {"error": f"RMAP processing error: {str(e)}"} - def _decrypt_message1_payload(self, payload: str) -&gt; dict[str, Any] | None: + def _decrypt_message1_payload(self, payload: str) -&gt; dict[str, Any] - None: """ Decrypt message 1 payload to extract identity and nonce_client. This allows us to capture the identity before passing to RMAP library.</pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 15.28s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1969"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1969_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1969_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1969_1"><button class="btn btn-outline-success"><span class="job_id">1969 : Job ID 88f70c48bf1f4d459957aa53146bb04f</span></button></div></a><div aria-labelledby="job_list___sub_heading_1969_1" data-parent="#job_list___sub_accordion_1969" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1969_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=190" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (190, 69), end pos: (190, 70)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -187,7 +187,7 @@ except Exception as e: return {"error": f"RMAP processing error: {str(e)}"} - def _find_identity_for_session(self, session_secret: str) -&gt; str | None: + def _find_identity_for_session(self, session_secret: str) -&gt; str - None: """ Try to find the identity that corresponds to this session secret. This implements correlation between Message 1 and Message 2.</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFFFF [100%]</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1970"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1970_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1970_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1970_1"><button class="btn btn-outline-success"><span class="job_id">1970 : Job ID dbf45ff871714b568676b6f6371f5354</span></button></div></a><div aria-labelledby="job_list___sub_heading_1970_1" data-parent="#job_list___sub_accordion_1970" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1970_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=207" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (207, 78), end pos: (207, 79)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -204,7 +204,7 @@ # Default fallback - better than hardcoded "RMAP_CLIENT" return "Unknown_Group" - def get_watermarked_pdf_info(self, session_secret: str) -&gt; dict[str, Any] | None: + def get_watermarked_pdf_info(self, session_secret: str) -&gt; dict[str, Any] - None: """Get watermarked PDF metadata for a session secret.""" return self.watermarked_pdfs.get(session_secret) </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFFFF [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T033504585499Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T033504771235Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 12 failed, 2 passed, 9 warnings in 13.99s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1971"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1971_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1971_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1971_1"><button class="btn btn-outline-success"><span class="job_id">1971 : Job ID f1b07052169f4aa296b7136fcc122dc9</span></button></div></a><div aria-labelledby="job_list___sub_heading_1971_1" data-parent="#job_list___sub_accordion_1971" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1971_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=211" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (211, 63), end pos: (211, 64)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -208,7 +208,7 @@ """Get watermarked PDF metadata for a session secret.""" return self.watermarked_pdfs.get(session_secret) - def get_session_identity(self, session_secret: str) -&gt; str | None: + def get_session_identity(self, session_secret: str) -&gt; str - None: """Get the identity (group name) for a session secret.""" return self.session_identities.get(session_secret) </pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 14.67s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1972"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1972_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1972_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1972_1"><button class="btn btn-outline-success"><span class="job_id">1972 : Job ID ed19360571ae4ea2b067a618c8d44752</span></button></div></a><div aria-labelledby="job_list___sub_heading_1972_1" data-parent="#job_list___sub_accordion_1972" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1972_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=34" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (34, 29), end pos: (34, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -31,7 +31,7 @@ def __init__( self, storage_dir: str, - public_keys_dir: str | None = None, + public_keys_dir: str * None = None, server_private_key: str | None = None, ): self.storage_dir = storage_dir</pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 15.24s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1973"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1973_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1973_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1973_1"><button class="btn btn-outline-success"><span class="job_id">1973 : Job ID 0280d4f908da43219e68c3a36e80b16b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1973_1" data-parent="#job_list___sub_accordion_1973" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1973_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=35" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (35, 32), end pos: (35, 33)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -32,7 +32,7 @@ self, storage_dir: str, public_keys_dir: str | None = None, - server_private_key: str | None = None, + server_private_key: str * None = None, ): self.storage_dir = storage_dir self.watermarked_pdfs: dict[</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFFFF [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T010115931210Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T010116312542Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 10 failed, 4 passed, 9 warnings in 14.03s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1974"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1974_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1974_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1974_1"><button class="btn btn-outline-success"><span class="job_id">1974 : Job ID 7271211b77364dfda16ac2aa44e46554</span></button></div></a><div aria-labelledby="job_list___sub_heading_1974_1" data-parent="#job_list___sub_accordion_1974" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1974_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=100" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (100, 72), end pos: (100, 73)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -97,7 +97,7 @@ except Exception as e: return {"error": f"RMAP processing error: {str(e)}"} - def _decrypt_message1_payload(self, payload: str) -&gt; dict[str, Any] | None: + def _decrypt_message1_payload(self, payload: str) -&gt; dict[str, Any] * None: """ Decrypt message 1 payload to extract identity and nonce_client. This allows us to capture the identity before passing to RMAP library.</pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 15.04s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1975"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1975_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1975_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1975_1"><button class="btn btn-outline-success"><span class="job_id">1975 : Job ID d74d5e0298874c78af2c692a9a183a52</span></button></div></a><div aria-labelledby="job_list___sub_heading_1975_1" data-parent="#job_list___sub_accordion_1975" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1975_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=190" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (190, 69), end pos: (190, 70)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -187,7 +187,7 @@ except Exception as e: return {"error": f"RMAP processing error: {str(e)}"} - def _find_identity_for_session(self, session_secret: str) -&gt; str | None: + def _find_identity_for_session(self, session_secret: str) -&gt; str * None: """ Try to find the identity that corresponds to this session secret. This implements correlation between Message 1 and Message 2.</pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 14.89s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1976"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1976_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1976_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1976_1"><button class="btn btn-outline-success"><span class="job_id">1976 : Job ID fa44544084bb4a16aa939b4eae527ba0</span></button></div></a><div aria-labelledby="job_list___sub_heading_1976_1" data-parent="#job_list___sub_accordion_1976" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1976_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=207" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (207, 78), end pos: (207, 79)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -204,7 +204,7 @@ # Default fallback - better than hardcoded "RMAP_CLIENT" return "Unknown_Group" - def get_watermarked_pdf_info(self, session_secret: str) -&gt; dict[str, Any] | None: + def get_watermarked_pdf_info(self, session_secret: str) -&gt; dict[str, Any] * None: """Get watermarked PDF metadata for a session secret.""" return self.watermarked_pdfs.get(session_secret) </pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 14.77s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1977"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1977_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1977_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1977_1"><button class="btn btn-outline-success"><span class="job_id">1977 : Job ID 911c76e860a4409da66149010c6a23f3</span></button></div></a><div aria-labelledby="job_list___sub_heading_1977_1" data-parent="#job_list___sub_accordion_1977" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1977_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=211" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (211, 63), end pos: (211, 64)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -208,7 +208,7 @@ """Get watermarked PDF metadata for a session secret.""" return self.watermarked_pdfs.get(session_secret) - def get_session_identity(self, session_secret: str) -&gt; str | None: + def get_session_identity(self, session_secret: str) -&gt; str * None: """Get the identity (group name) for a session secret.""" return self.session_identities.get(session_secret) </pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 16.77s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1978"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1978_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1978_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1978_1"><button class="btn btn-outline-success"><span class="job_id">1978 : Job ID 20e915926df34998b670d940d9b12a44</span></button></div></a><div aria-labelledby="job_list___sub_heading_1978_1" data-parent="#job_list___sub_accordion_1978" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1978_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=34" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (34, 29), end pos: (34, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -31,7 +31,7 @@ def __init__( self, storage_dir: str, - public_keys_dir: str | None = None, + public_keys_dir: str / None = None, server_private_key: str | None = None, ): self.storage_dir = storage_dir</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFFFF [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T055412489591Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T055412735264Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 12 failed, 2 passed, 9 warnings in 13.86s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1979"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1979_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1979_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1979_1"><button class="btn btn-outline-success"><span class="job_id">1979 : Job ID ea25e8a83d984899bdbc129dc3505fef</span></button></div></a><div aria-labelledby="job_list___sub_heading_1979_1" data-parent="#job_list___sub_accordion_1979" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1979_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=35" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (35, 32), end pos: (35, 33)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -32,7 +32,7 @@ self, storage_dir: str, public_keys_dir: str | None = None, - server_private_key: str | None = None, + server_private_key: str / None = None, ): self.storage_dir = storage_dir self.watermarked_pdfs: dict[</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFFFF [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T163345299270Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T163345612473Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 10 failed, 4 passed, 9 warnings in 14.02s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1980"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1980_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1980_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1980_1"><button class="btn btn-outline-success"><span class="job_id">1980 : Job ID 7173cf717df347569a749c0cc753251b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1980_1" data-parent="#job_list___sub_accordion_1980" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1980_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=100" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (100, 72), end pos: (100, 73)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -97,7 +97,7 @@ except Exception as e: return {"error": f"RMAP processing error: {str(e)}"} - def _decrypt_message1_payload(self, payload: str) -&gt; dict[str, Any] | None: + def _decrypt_message1_payload(self, payload: str) -&gt; dict[str, Any] / None: """ Decrypt message 1 payload to extract identity and nonce_client. This allows us to capture the identity before passing to RMAP library.</pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 14.85s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1981"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1981_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1981_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1981_1"><button class="btn btn-outline-success"><span class="job_id">1981 : Job ID 46fc451e16e449ca844486e99c9001c3</span></button></div></a><div aria-labelledby="job_list___sub_heading_1981_1" data-parent="#job_list___sub_accordion_1981" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1981_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=190" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (190, 69), end pos: (190, 70)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -187,7 +187,7 @@ except Exception as e: return {"error": f"RMAP processing error: {str(e)}"} - def _find_identity_for_session(self, session_secret: str) -&gt; str | None: + def _find_identity_for_session(self, session_secret: str) -&gt; str / None: """ Try to find the identity that corresponds to this session secret. This implements correlation between Message 1 and Message 2.</pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 14.82s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1982"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1982_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1982_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1982_1"><button class="btn btn-outline-success"><span class="job_id">1982 : Job ID 3e7c7eefddaa4cd9ad0590e0d6fa2b7a</span></button></div></a><div aria-labelledby="job_list___sub_heading_1982_1" data-parent="#job_list___sub_accordion_1982" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1982_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=207" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (207, 78), end pos: (207, 79)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -204,7 +204,7 @@ # Default fallback - better than hardcoded "RMAP_CLIENT" return "Unknown_Group" - def get_watermarked_pdf_info(self, session_secret: str) -&gt; dict[str, Any] | None: + def get_watermarked_pdf_info(self, session_secret: str) -&gt; dict[str, Any] / None: """Get watermarked PDF metadata for a session secret.""" return self.watermarked_pdfs.get(session_secret) </pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 15.07s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1983"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1983_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1983_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1983_1"><button class="btn btn-outline-success"><span class="job_id">1983 : Job ID cb45dbe0489744c286d69b950f684d26</span></button></div></a><div aria-labelledby="job_list___sub_heading_1983_1" data-parent="#job_list___sub_accordion_1983" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1983_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=211" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (211, 63), end pos: (211, 64)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -208,7 +208,7 @@ """Get watermarked PDF metadata for a session secret.""" return self.watermarked_pdfs.get(session_secret) - def get_session_identity(self, session_secret: str) -&gt; str | None: + def get_session_identity(self, session_secret: str) -&gt; str / None: """Get the identity (group name) for a session secret.""" return self.session_identities.get(session_secret) </pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 15.01s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1984"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1984_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1984_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1984_1"><button class="btn btn-outline-success"><span class="job_id">1984 : Job ID 295859e11a304bd78cb0d924c7c053e9</span></button></div></a><div aria-labelledby="job_list___sub_heading_1984_1" data-parent="#job_list___sub_accordion_1984" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1984_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=34" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (34, 29), end pos: (34, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -31,7 +31,7 @@ def __init__( self, storage_dir: str, - public_keys_dir: str | None = None, + public_keys_dir: str // None = None, server_private_key: str | None = None, ): self.storage_dir = storage_dir</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFFFF [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T170438903750Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T170439139365Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 12 failed, 2 passed, 9 warnings in 13.87s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1985"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1985_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1985_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1985_1"><button class="btn btn-outline-success"><span class="job_id">1985 : Job ID 26493acae8ed42c39db43c722d018bb1</span></button></div></a><div aria-labelledby="job_list___sub_heading_1985_1" data-parent="#job_list___sub_accordion_1985" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1985_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=35" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (35, 32), end pos: (35, 33)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -32,7 +32,7 @@ self, storage_dir: str, public_keys_dir: str | None = None, - server_private_key: str | None = None, + server_private_key: str // None = None, ): self.storage_dir = storage_dir self.watermarked_pdfs: dict[</pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 15.01s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1986"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1986_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1986_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1986_1"><button class="btn btn-outline-success"><span class="job_id">1986 : Job ID 867c3853ebc04ed1818050e5bd5e1752</span></button></div></a><div aria-labelledby="job_list___sub_heading_1986_1" data-parent="#job_list___sub_accordion_1986" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1986_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=100" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (100, 72), end pos: (100, 73)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -97,7 +97,7 @@ except Exception as e: return {"error": f"RMAP processing error: {str(e)}"} - def _decrypt_message1_payload(self, payload: str) -&gt; dict[str, Any] | None: + def _decrypt_message1_payload(self, payload: str) -&gt; dict[str, Any] // None: """ Decrypt message 1 payload to extract identity and nonce_client. This allows us to capture the identity before passing to RMAP library.</pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 14.98s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1987"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1987_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1987_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1987_1"><button class="btn btn-outline-success"><span class="job_id">1987 : Job ID 237cfc21a26e48d49105d057a17ef32d</span></button></div></a><div aria-labelledby="job_list___sub_heading_1987_1" data-parent="#job_list___sub_accordion_1987" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1987_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=190" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (190, 69), end pos: (190, 70)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -187,7 +187,7 @@ except Exception as e: return {"error": f"RMAP processing error: {str(e)}"} - def _find_identity_for_session(self, session_secret: str) -&gt; str | None: + def _find_identity_for_session(self, session_secret: str) -&gt; str // None: """ Try to find the identity that corresponds to this session secret. This implements correlation between Message 1 and Message 2.</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFFFF [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T045341450753Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T045341722266Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 12 failed, 2 passed, 9 warnings in 14.15s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1988"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1988_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1988_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1988_1"><button class="btn btn-outline-success"><span class="job_id">1988 : Job ID be62885461f84a7a98fe47c6219f1ac2</span></button></div></a><div aria-labelledby="job_list___sub_heading_1988_1" data-parent="#job_list___sub_accordion_1988" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1988_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=207" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (207, 78), end pos: (207, 79)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -204,7 +204,7 @@ # Default fallback - better than hardcoded "RMAP_CLIENT" return "Unknown_Group" - def get_watermarked_pdf_info(self, session_secret: str) -&gt; dict[str, Any] | None: + def get_watermarked_pdf_info(self, session_secret: str) -&gt; dict[str, Any] // None: """Get watermarked PDF metadata for a session secret.""" return self.watermarked_pdfs.get(session_secret) </pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 15.10s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1989"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1989_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1989_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1989_1"><button class="btn btn-outline-success"><span class="job_id">1989 : Job ID ae2b6b41f08e4d0eae58bc2769db49fc</span></button></div></a><div aria-labelledby="job_list___sub_heading_1989_1" data-parent="#job_list___sub_accordion_1989" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1989_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=211" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (211, 63), end pos: (211, 64)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -208,7 +208,7 @@ """Get watermarked PDF metadata for a session secret.""" return self.watermarked_pdfs.get(session_secret) - def get_session_identity(self, session_secret: str) -&gt; str | None: + def get_session_identity(self, session_secret: str) -&gt; str // None: """Get the identity (group name) for a session secret.""" return self.session_identities.get(session_secret) </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFFFF [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T012945444343Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T012945687791Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 12 failed, 2 passed, 9 warnings in 13.78s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1990"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1990_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1990_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1990_1"><button class="btn btn-outline-success"><span class="job_id">1990 : Job ID 7897c907cf7c420bbf27af28facb41ca</span></button></div></a><div aria-labelledby="job_list___sub_heading_1990_1" data-parent="#job_list___sub_accordion_1990" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1990_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=34" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (34, 29), end pos: (34, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -31,7 +31,7 @@ def __init__( self, storage_dir: str, - public_keys_dir: str | None = None, + public_keys_dir: str % None = None, server_private_key: str | None = None, ): self.storage_dir = storage_dir</pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 14.98s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1991"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1991_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1991_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1991_1"><button class="btn btn-outline-success"><span class="job_id">1991 : Job ID cfa8df1f6e9a486fb597010bdb3b92d1</span></button></div></a><div aria-labelledby="job_list___sub_heading_1991_1" data-parent="#job_list___sub_accordion_1991" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1991_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=35" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (35, 32), end pos: (35, 33)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -32,7 +32,7 @@ self, storage_dir: str, public_keys_dir: str | None = None, - server_private_key: str | None = None, + server_private_key: str % None = None, ): self.storage_dir = storage_dir self.watermarked_pdfs: dict[</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFFFF [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T151216048026Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T151216258774Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 12 failed, 2 passed, 9 warnings in 13.80s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1992"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1992_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1992_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1992_1"><button class="btn btn-outline-success"><span class="job_id">1992 : Job ID f5937265e34143cb8d7ed94511ec99eb</span></button></div></a><div aria-labelledby="job_list___sub_heading_1992_1" data-parent="#job_list___sub_accordion_1992" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1992_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=100" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (100, 72), end pos: (100, 73)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -97,7 +97,7 @@ except Exception as e: return {"error": f"RMAP processing error: {str(e)}"} - def _decrypt_message1_payload(self, payload: str) -&gt; dict[str, Any] | None: + def _decrypt_message1_payload(self, payload: str) -&gt; dict[str, Any] % None: """ Decrypt message 1 payload to extract identity and nonce_client. This allows us to capture the identity before passing to RMAP library.</pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 15.02s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1993"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1993_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1993_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1993_1"><button class="btn btn-outline-success"><span class="job_id">1993 : Job ID c1b266905de04ab0bf5e64e21880d407</span></button></div></a><div aria-labelledby="job_list___sub_heading_1993_1" data-parent="#job_list___sub_accordion_1993" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1993_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=190" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (190, 69), end pos: (190, 70)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -187,7 +187,7 @@ except Exception as e: return {"error": f"RMAP processing error: {str(e)}"} - def _find_identity_for_session(self, session_secret: str) -&gt; str | None: + def _find_identity_for_session(self, session_secret: str) -&gt; str % None: """ Try to find the identity that corresponds to this session secret. This implements correlation between Message 1 and Message 2.</pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 15.22s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1994"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1994_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1994_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1994_1"><button class="btn btn-outline-success"><span class="job_id">1994 : Job ID 2402f081c44242609986a7b753d7d8ac</span></button></div></a><div aria-labelledby="job_list___sub_heading_1994_1" data-parent="#job_list___sub_accordion_1994" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1994_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=207" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (207, 78), end pos: (207, 79)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -204,7 +204,7 @@ # Default fallback - better than hardcoded "RMAP_CLIENT" return "Unknown_Group" - def get_watermarked_pdf_info(self, session_secret: str) -&gt; dict[str, Any] | None: + def get_watermarked_pdf_info(self, session_secret: str) -&gt; dict[str, Any] % None: """Get watermarked PDF metadata for a session secret.""" return self.watermarked_pdfs.get(session_secret) </pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 15.11s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1995"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1995_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1995_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1995_1"><button class="btn btn-outline-success"><span class="job_id">1995 : Job ID d0e7c130e3204919b7e15065068fda5d</span></button></div></a><div aria-labelledby="job_list___sub_heading_1995_1" data-parent="#job_list___sub_accordion_1995" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1995_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=211" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (211, 63), end pos: (211, 64)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -208,7 +208,7 @@ """Get watermarked PDF metadata for a session secret.""" return self.watermarked_pdfs.get(session_secret) - def get_session_identity(self, session_secret: str) -&gt; str | None: + def get_session_identity(self, session_secret: str) -&gt; str % None: """Get the identity (group name) for a session secret.""" return self.session_identities.get(session_secret) </pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFFFF [100%]</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1996"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1996_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1996_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1996_1"><button class="btn btn-outline-success"><span class="job_id">1996 : Job ID 7a353469f1b545f3843e400339a91517</span></button></div></a><div aria-labelledby="job_list___sub_heading_1996_1" data-parent="#job_list___sub_accordion_1996" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1996_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=34" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (34, 29), end pos: (34, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -31,7 +31,7 @@ def __init__( self, storage_dir: str, - public_keys_dir: str | None = None, + public_keys_dir: str ** None = None, server_private_key: str | None = None, ): self.storage_dir = storage_dir</pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 15.01s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1997"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1997_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1997_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1997_1"><button class="btn btn-outline-success"><span class="job_id">1997 : Job ID 272d238609c34e5c9f4397d5ce41b6bb</span></button></div></a><div aria-labelledby="job_list___sub_heading_1997_1" data-parent="#job_list___sub_accordion_1997" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1997_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=35" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (35, 32), end pos: (35, 33)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -32,7 +32,7 @@ self, storage_dir: str, public_keys_dir: str | None = None, - server_private_key: str | None = None, + server_private_key: str ** None = None, ): self.storage_dir = storage_dir self.watermarked_pdfs: dict[</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFFFF [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T033938495592Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T033938840019Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 10 failed, 4 passed, 9 warnings in 14.37s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1998"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1998_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1998_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1998_1"><button class="btn btn-outline-success"><span class="job_id">1998 : Job ID b038c23219434d79b7bb4383a52d485e</span></button></div></a><div aria-labelledby="job_list___sub_heading_1998_1" data-parent="#job_list___sub_accordion_1998" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1998_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=100" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (100, 72), end pos: (100, 73)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -97,7 +97,7 @@ except Exception as e: return {"error": f"RMAP processing error: {str(e)}"} - def _decrypt_message1_payload(self, payload: str) -&gt; dict[str, Any] | None: + def _decrypt_message1_payload(self, payload: str) -&gt; dict[str, Any] ** None: """ Decrypt message 1 payload to extract identity and nonce_client. This allows us to capture the identity before passing to RMAP library.</pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 15.19s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_1999"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_1999_1" aria-expanded="false" aria-controls="job_list___sub_collapse_1999_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_1999_1"><button class="btn btn-outline-success"><span class="job_id">1999 : Job ID 0e32de8fb3404aa1b61f17545a0bfe2b</span></button></div></a><div aria-labelledby="job_list___sub_heading_1999_1" data-parent="#job_list___sub_accordion_1999" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_1999_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=190" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (190, 69), end pos: (190, 70)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -187,7 +187,7 @@ except Exception as e: return {"error": f"RMAP processing error: {str(e)}"} - def _find_identity_for_session(self, session_secret: str) -&gt; str | None: + def _find_identity_for_session(self, session_secret: str) -&gt; str ** None: """ Try to find the identity that corresponds to this session secret. This implements correlation between Message 1 and Message 2.</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFFFF [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T004943669694Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T004943960120Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 12 failed, 2 passed, 9 warnings in 13.97s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2000"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2000_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2000_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2000_1"><button class="btn btn-outline-success"><span class="job_id">2000 : Job ID 8d5838ccac4d48ae9444f008b6c9e709</span></button></div></a><div aria-labelledby="job_list___sub_heading_2000_1" data-parent="#job_list___sub_accordion_2000" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2000_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=207" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (207, 78), end pos: (207, 79)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -204,7 +204,7 @@ # Default fallback - better than hardcoded "RMAP_CLIENT" return "Unknown_Group" - def get_watermarked_pdf_info(self, session_secret: str) -&gt; dict[str, Any] | None: + def get_watermarked_pdf_info(self, session_secret: str) -&gt; dict[str, Any] ** None: """Get watermarked PDF metadata for a session secret.""" return self.watermarked_pdfs.get(session_secret) </pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFFFF [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T154732374516Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T154732712528Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 10 failed, 4 passed, 9 warnings in 14.04s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2001"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2001_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2001_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2001_1"><button class="btn btn-outline-success"><span class="job_id">2001 : Job ID fd3aa83246724495aa3d9aceae5c8687</span></button></div></a><div aria-labelledby="job_list___sub_heading_2001_1" data-parent="#job_list___sub_accordion_2001" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2001_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=211" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (211, 63), end pos: (211, 64)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -208,7 +208,7 @@ """Get watermarked PDF metadata for a session secret.""" return self.watermarked_pdfs.get(session_secret) - def get_session_identity(self, session_secret: str) -&gt; str | None: + def get_session_identity(self, session_secret: str) -&gt; str ** None: """Get the identity (group name) for a session secret.""" return self.session_identities.get(session_secret) </pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFFFF [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T155402885324Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T155403237776Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 10 failed, 4 passed, 9 warnings in 14.02s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2002"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2002_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2002_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2002_1"><button class="btn btn-outline-success"><span class="job_id">2002 : Job ID f2ab8966591349dc934c352b57fe8476</span></button></div></a><div aria-labelledby="job_list___sub_heading_2002_1" data-parent="#job_list___sub_accordion_2002" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2002_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=34" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (34, 29), end pos: (34, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -31,7 +31,7 @@ def __init__( self, storage_dir: str, - public_keys_dir: str | None = None, + public_keys_dir: str &gt;&gt; None = None, server_private_key: str | None = None, ): self.storage_dir = storage_dir</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFFFF [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T001806113266Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T001806476186Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 10 failed, 4 passed, 9 warnings in 14.10s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2003"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2003_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2003_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2003_1"><button class="btn btn-outline-success"><span class="job_id">2003 : Job ID 590cdbbf995d4e4abb748cfe9baef3fa</span></button></div></a><div aria-labelledby="job_list___sub_heading_2003_1" data-parent="#job_list___sub_accordion_2003" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2003_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=35" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (35, 32), end pos: (35, 33)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -32,7 +32,7 @@ self, storage_dir: str, public_keys_dir: str | None = None, - server_private_key: str | None = None, + server_private_key: str &gt;&gt; None = None, ): self.storage_dir = storage_dir self.watermarked_pdfs: dict[</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFFFF [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T005856293263Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T005856627145Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 10 failed, 4 passed, 9 warnings in 14.08s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2004"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2004_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2004_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2004_1"><button class="btn btn-outline-success"><span class="job_id">2004 : Job ID 985376d49cc447e9bf0593cff08cfbf0</span></button></div></a><div aria-labelledby="job_list___sub_heading_2004_1" data-parent="#job_list___sub_accordion_2004" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2004_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=100" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (100, 72), end pos: (100, 73)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -97,7 +97,7 @@ except Exception as e: return {"error": f"RMAP processing error: {str(e)}"} - def _decrypt_message1_payload(self, payload: str) -&gt; dict[str, Any] | None: + def _decrypt_message1_payload(self, payload: str) -&gt; dict[str, Any] &gt;&gt; None: """ Decrypt message 1 payload to extract identity and nonce_client. This allows us to capture the identity before passing to RMAP library.</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFFFF [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T014039843649Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T014040115811Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 12 failed, 2 passed, 9 warnings in 13.94s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2005"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2005_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2005_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2005_1"><button class="btn btn-outline-success"><span class="job_id">2005 : Job ID ad5247d1ef8d4297bea158d26c57e7ad</span></button></div></a><div aria-labelledby="job_list___sub_heading_2005_1" data-parent="#job_list___sub_accordion_2005" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2005_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=190" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (190, 69), end pos: (190, 70)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -187,7 +187,7 @@ except Exception as e: return {"error": f"RMAP processing error: {str(e)}"} - def _find_identity_for_session(self, session_secret: str) -&gt; str | None: + def _find_identity_for_session(self, session_secret: str) -&gt; str &gt;&gt; None: """ Try to find the identity that corresponds to this session secret. This implements correlation between Message 1 and Message 2.</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFFFF [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T182245380730Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T182245598045Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 12 failed, 2 passed, 9 warnings in 13.85s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2006"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2006_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2006_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2006_1"><button class="btn btn-outline-success"><span class="job_id">2006 : Job ID 8435c897723b455e86bb121966a45a81</span></button></div></a><div aria-labelledby="job_list___sub_heading_2006_1" data-parent="#job_list___sub_accordion_2006" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2006_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=207" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (207, 78), end pos: (207, 79)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -204,7 +204,7 @@ # Default fallback - better than hardcoded "RMAP_CLIENT" return "Unknown_Group" - def get_watermarked_pdf_info(self, session_secret: str) -&gt; dict[str, Any] | None: + def get_watermarked_pdf_info(self, session_secret: str) -&gt; dict[str, Any] &gt;&gt; None: """Get watermarked PDF metadata for a session secret.""" return self.watermarked_pdfs.get(session_secret) </pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 14.77s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2007"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2007_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2007_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2007_1"><button class="btn btn-outline-success"><span class="job_id">2007 : Job ID d6dd084177eb4795b5c2a89286901e8d</span></button></div></a><div aria-labelledby="job_list___sub_heading_2007_1" data-parent="#job_list___sub_accordion_2007" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2007_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=211" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (211, 63), end pos: (211, 64)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -208,7 +208,7 @@ """Get watermarked PDF metadata for a session secret.""" return self.watermarked_pdfs.get(session_secret) - def get_session_identity(self, session_secret: str) -&gt; str | None: + def get_session_identity(self, session_secret: str) -&gt; str &gt;&gt; None: """Get the identity (group name) for a session secret.""" return self.session_identities.get(session_secret) </pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 16.03s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2008"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2008_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2008_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2008_1"><button class="btn btn-outline-success"><span class="job_id">2008 : Job ID 886ab7c85fce42228f9d33637afee583</span></button></div></a><div aria-labelledby="job_list___sub_heading_2008_1" data-parent="#job_list___sub_accordion_2008" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2008_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=34" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (34, 29), end pos: (34, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -31,7 +31,7 @@ def __init__( self, storage_dir: str, - public_keys_dir: str | None = None, + public_keys_dir: str &lt;&lt; None = None, server_private_key: str | None = None, ): self.storage_dir = storage_dir</pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 15.02s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2009"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2009_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2009_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2009_1"><button class="btn btn-outline-success"><span class="job_id">2009 : Job ID b71af070a6e445b2b543539c6bd69f96</span></button></div></a><div aria-labelledby="job_list___sub_heading_2009_1" data-parent="#job_list___sub_accordion_2009" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2009_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=35" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (35, 32), end pos: (35, 33)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -32,7 +32,7 @@ self, storage_dir: str, public_keys_dir: str | None = None, - server_private_key: str | None = None, + server_private_key: str &lt;&lt; None = None, ): self.storage_dir = storage_dir self.watermarked_pdfs: dict[</pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 14.91s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2010"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2010_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2010_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2010_1"><button class="btn btn-outline-success"><span class="job_id">2010 : Job ID 5187b34a0e9c464a9bbb34cbbb45adf1</span></button></div></a><div aria-labelledby="job_list___sub_heading_2010_1" data-parent="#job_list___sub_accordion_2010" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2010_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=100" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (100, 72), end pos: (100, 73)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -97,7 +97,7 @@ except Exception as e: return {"error": f"RMAP processing error: {str(e)}"} - def _decrypt_message1_payload(self, payload: str) -&gt; dict[str, Any] | None: + def _decrypt_message1_payload(self, payload: str) -&gt; dict[str, Any] &lt;&lt; None: """ Decrypt message 1 payload to extract identity and nonce_client. This allows us to capture the identity before passing to RMAP library.</pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 14.87s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2011"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2011_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2011_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2011_1"><button class="btn btn-outline-success"><span class="job_id">2011 : Job ID 6af389fbc9364c129e41affde699f871</span></button></div></a><div aria-labelledby="job_list___sub_heading_2011_1" data-parent="#job_list___sub_accordion_2011" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2011_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=190" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (190, 69), end pos: (190, 70)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -187,7 +187,7 @@ except Exception as e: return {"error": f"RMAP processing error: {str(e)}"} - def _find_identity_for_session(self, session_secret: str) -&gt; str | None: + def _find_identity_for_session(self, session_secret: str) -&gt; str &lt;&lt; None: """ Try to find the identity that corresponds to this session secret. This implements correlation between Message 1 and Message 2.</pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 15.12s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2012"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2012_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2012_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2012_1"><button class="btn btn-outline-success"><span class="job_id">2012 : Job ID c780a5b96e3d408294d28614b8e49b3b</span></button></div></a><div aria-labelledby="job_list___sub_heading_2012_1" data-parent="#job_list___sub_accordion_2012" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2012_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=207" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (207, 78), end pos: (207, 79)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -204,7 +204,7 @@ # Default fallback - better than hardcoded "RMAP_CLIENT" return "Unknown_Group" - def get_watermarked_pdf_info(self, session_secret: str) -&gt; dict[str, Any] | None: + def get_watermarked_pdf_info(self, session_secret: str) -&gt; dict[str, Any] &lt;&lt; None: """Get watermarked PDF metadata for a session secret.""" return self.watermarked_pdfs.get(session_secret) </pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFFFF [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T212430602020Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T212430948015Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 10 failed, 4 passed, 9 warnings in 14.41s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2013"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2013_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2013_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2013_1"><button class="btn btn-outline-success"><span class="job_id">2013 : Job ID 8b13c5ac8d1e4cf7aef879593829ed35</span></button></div></a><div aria-labelledby="job_list___sub_heading_2013_1" data-parent="#job_list___sub_accordion_2013" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2013_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=211" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (211, 63), end pos: (211, 64)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -208,7 +208,7 @@ """Get watermarked PDF metadata for a session secret.""" return self.watermarked_pdfs.get(session_secret) - def get_session_identity(self, session_secret: str) -&gt; str | None: + def get_session_identity(self, session_secret: str) -&gt; str &lt;&lt; None: """Get the identity (group name) for a session secret.""" return self.session_identities.get(session_secret) </pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 15.66s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2014"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2014_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2014_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2014_1"><button class="btn btn-outline-success"><span class="job_id">2014 : Job ID 11a42786baa34bd5afb48762f2fcb028</span></button></div></a><div aria-labelledby="job_list___sub_heading_2014_1" data-parent="#job_list___sub_accordion_2014" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2014_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=34" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (34, 29), end pos: (34, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -31,7 +31,7 @@ def __init__( self, storage_dir: str, - public_keys_dir: str | None = None, + public_keys_dir: str &amp; None = None, server_private_key: str | None = None, ): self.storage_dir = storage_dir</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFFFF [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T015456455316Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T015456743765Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 12 failed, 2 passed, 9 warnings in 13.92s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2015"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2015_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2015_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2015_1"><button class="btn btn-outline-success"><span class="job_id">2015 : Job ID f2663b5c29a940b9b3bcfb145d8b40f4</span></button></div></a><div aria-labelledby="job_list___sub_heading_2015_1" data-parent="#job_list___sub_accordion_2015" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2015_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=35" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (35, 32), end pos: (35, 33)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -32,7 +32,7 @@ self, storage_dir: str, public_keys_dir: str | None = None, - server_private_key: str | None = None, + server_private_key: str &amp; None = None, ): self.storage_dir = storage_dir self.watermarked_pdfs: dict[</pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 14.98s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2016"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2016_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2016_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2016_1"><button class="btn btn-outline-success"><span class="job_id">2016 : Job ID c5e5c38f453a4ef5b0c90ee6296a2248</span></button></div></a><div aria-labelledby="job_list___sub_heading_2016_1" data-parent="#job_list___sub_accordion_2016" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2016_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=100" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (100, 72), end pos: (100, 73)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -97,7 +97,7 @@ except Exception as e: return {"error": f"RMAP processing error: {str(e)}"} - def _decrypt_message1_payload(self, payload: str) -&gt; dict[str, Any] | None: + def _decrypt_message1_payload(self, payload: str) -&gt; dict[str, Any] &amp; None: """ Decrypt message 1 payload to extract identity and nonce_client. This allows us to capture the identity before passing to RMAP library.</pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 15.13s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2017"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2017_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2017_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2017_1"><button class="btn btn-outline-success"><span class="job_id">2017 : Job ID 6d4de9f99c7144508cc15c8cda31c3ac</span></button></div></a><div aria-labelledby="job_list___sub_heading_2017_1" data-parent="#job_list___sub_accordion_2017" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2017_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=190" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (190, 69), end pos: (190, 70)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -187,7 +187,7 @@ except Exception as e: return {"error": f"RMAP processing error: {str(e)}"} - def _find_identity_for_session(self, session_secret: str) -&gt; str | None: + def _find_identity_for_session(self, session_secret: str) -&gt; str &amp; None: """ Try to find the identity that corresponds to this session secret. This implements correlation between Message 1 and Message 2.</pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 14.97s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2018"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2018_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2018_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2018_1"><button class="btn btn-outline-success"><span class="job_id">2018 : Job ID 7b80dde6a3fd4fb7b450b76d27d7162b</span></button></div></a><div aria-labelledby="job_list___sub_heading_2018_1" data-parent="#job_list___sub_accordion_2018" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2018_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=207" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (207, 78), end pos: (207, 79)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -204,7 +204,7 @@ # Default fallback - better than hardcoded "RMAP_CLIENT" return "Unknown_Group" - def get_watermarked_pdf_info(self, session_secret: str) -&gt; dict[str, Any] | None: + def get_watermarked_pdf_info(self, session_secret: str) -&gt; dict[str, Any] &amp; None: """Get watermarked PDF metadata for a session secret.""" return self.watermarked_pdfs.get(session_secret) </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFFFF [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T201258562644Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T201258789910Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 12 failed, 2 passed, 9 warnings in 13.89s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2019"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2019_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2019_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2019_1"><button class="btn btn-outline-success"><span class="job_id">2019 : Job ID 5b4fbdaf10d144b5a4d3307cecb3902a</span></button></div></a><div aria-labelledby="job_list___sub_heading_2019_1" data-parent="#job_list___sub_accordion_2019" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2019_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=211" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (211, 63), end pos: (211, 64)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -208,7 +208,7 @@ """Get watermarked PDF metadata for a session secret.""" return self.watermarked_pdfs.get(session_secret) - def get_session_identity(self, session_secret: str) -&gt; str | None: + def get_session_identity(self, session_secret: str) -&gt; str &amp; None: """Get the identity (group name) for a session secret.""" return self.session_identities.get(session_secret) </pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 15.06s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2020"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2020_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2020_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2020_1"><button class="btn btn-outline-success"><span class="job_id">2020 : Job ID 8d257ff8cd5a49ea8b1eec20cc5c0878</span></button></div></a><div aria-labelledby="job_list___sub_heading_2020_1" data-parent="#job_list___sub_accordion_2020" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2020_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=34" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (34, 29), end pos: (34, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -31,7 +31,7 @@ def __init__( self, storage_dir: str, - public_keys_dir: str | None = None, + public_keys_dir: str ^ None = None, server_private_key: str | None = None, ): self.storage_dir = storage_dir</pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 15.46s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2021"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2021_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2021_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2021_1"><button class="btn btn-outline-success"><span class="job_id">2021 : Job ID d6f598e670f248e5b8d97d7251f02b91</span></button></div></a><div aria-labelledby="job_list___sub_heading_2021_1" data-parent="#job_list___sub_accordion_2021" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2021_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=35" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (35, 32), end pos: (35, 33)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -32,7 +32,7 @@ self, storage_dir: str, public_keys_dir: str | None = None, - server_private_key: str | None = None, + server_private_key: str ^ None = None, ): self.storage_dir = storage_dir self.watermarked_pdfs: dict[</pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 15.30s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2022"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2022_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2022_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2022_1"><button class="btn btn-outline-success"><span class="job_id">2022 : Job ID 29eb2b893ee6448ea5d9d4e7910a0054</span></button></div></a><div aria-labelledby="job_list___sub_heading_2022_1" data-parent="#job_list___sub_accordion_2022" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2022_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=100" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (100, 72), end pos: (100, 73)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -97,7 +97,7 @@ except Exception as e: return {"error": f"RMAP processing error: {str(e)}"} - def _decrypt_message1_payload(self, payload: str) -&gt; dict[str, Any] | None: + def _decrypt_message1_payload(self, payload: str) -&gt; dict[str, Any] ^ None: """ Decrypt message 1 payload to extract identity and nonce_client. This allows us to capture the identity before passing to RMAP library.</pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 15.04s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2023"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2023_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2023_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2023_1"><button class="btn btn-outline-success"><span class="job_id">2023 : Job ID b7ed7b5aaa85413a8beb120fbddc20cd</span></button></div></a><div aria-labelledby="job_list___sub_heading_2023_1" data-parent="#job_list___sub_accordion_2023" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2023_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=190" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (190, 69), end pos: (190, 70)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -187,7 +187,7 @@ except Exception as e: return {"error": f"RMAP processing error: {str(e)}"} - def _find_identity_for_session(self, session_secret: str) -&gt; str | None: + def _find_identity_for_session(self, session_secret: str) -&gt; str ^ None: """ Try to find the identity that corresponds to this session secret. This implements correlation between Message 1 and Message 2.</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFFFF [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 6 failed, 8 passed, 9 warnings in 15.04s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2024"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2024_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2024_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2024_1"><button class="btn btn-outline-success"><span class="job_id">2024 : Job ID a3b2e48915224406bc3da4e91c91d250</span></button></div></a><div aria-labelledby="job_list___sub_heading_2024_1" data-parent="#job_list___sub_accordion_2024" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2024_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=207" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (207, 78), end pos: (207, 79)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -204,7 +204,7 @@ # Default fallback - better than hardcoded "RMAP_CLIENT" return "Unknown_Group" - def get_watermarked_pdf_info(self, session_secret: str) -&gt; dict[str, Any] | None: + def get_watermarked_pdf_info(self, session_secret: str) -&gt; dict[str, Any] ^ None: """Get watermarked PDF metadata for a session secret.""" return self.watermarked_pdfs.get(session_secret) </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFFFF [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T050718351243Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T050718582845Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 12 failed, 2 passed, 9 warnings in 14.50s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2025"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2025_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2025_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2025_1"><button class="btn btn-outline-success"><span class="job_id">2025 : Job ID b583ef462eb5422593a54dfe9fd5cb33</span></button></div></a><div aria-labelledby="job_list___sub_heading_2025_1" data-parent="#job_list___sub_accordion_2025" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2025_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=211" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (211, 63), end pos: (211, 64)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -208,7 +208,7 @@ """Get watermarked PDF metadata for a session secret.""" return self.watermarked_pdfs.get(session_secret) - def get_session_identity(self, session_secret: str) -&gt; str | None: + def get_session_identity(self, session_secret: str) -&gt; str ^ None: """Get the identity (group name) for a session secret.""" return self.session_identities.get(session_secret) </pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 405 == 200 E + where 405 = &lt;WrapperTestResponse streamed [405 METHOD NOT ALLOWED]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( test/test_api.py::test_rmap_initiate test/test_api.py::test_rmap_get_link C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 405 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 405 == 200 2 failed, 12 passed, 9 warnings in 15.75s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2026"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2026_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2026_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2026_1"><button class="btn btn-outline-success"><span class="job_id">2026 : Job ID 05b26c6aaee741b7894dd2cad2309f6e</span></button></div></a><div aria-labelledby="job_list___sub_heading_2026_1" data-parent="#job_list___sub_accordion_2026" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2026_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=164" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (164, 39), end pos: (164, 40)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Lt_Eq, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -161,7 +161,7 @@ session_secret = result["result"] # Ensure it's a 32-character hex string - if len(session_secret) &lt; 32: + if len(session_secret) == 32: session_secret = session_secret.zfill(32) elif len(session_secret) &gt; 32: session_secret = session_secret[:32]</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T222621577532Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T222622444808Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.51s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2027"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2027_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2027_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2027_1"><button class="btn btn-outline-danger"><span class="job_id">2027 : Job ID 02fa269f52ce47afad2436cbd344c4a4</span></button></div></a><div aria-labelledby="job_list___sub_heading_2027_1" data-parent="#job_list___sub_accordion_2027" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2027_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=164" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (164, 39), end pos: (164, 40)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Lt_NotEq, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -161,7 +161,7 @@ session_secret = result["result"] # Ensure it's a 32-character hex string - if len(session_secret) &lt; 32: + if len(session_secret) != 32: session_secret = session_secret.zfill(32) elif len(session_secret) &gt; 32: session_secret = session_secret[:32]</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.10s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2028"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2028_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2028_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2028_1"><button class="btn btn-outline-danger"><span class="job_id">2028 : Job ID 0865630d9c724aeea4a8a5165c34aead</span></button></div></a><div aria-labelledby="job_list___sub_heading_2028_1" data-parent="#job_list___sub_accordion_2028" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2028_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=164" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (164, 39), end pos: (164, 40)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Lt_LtE, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -161,7 +161,7 @@ session_secret = result["result"] # Ensure it's a 32-character hex string - if len(session_secret) &lt; 32: + if len(session_secret) &lt;= 32: session_secret = session_secret.zfill(32) elif len(session_secret) &gt; 32: session_secret = session_secret[:32]</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.15s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2029"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2029_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2029_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2029_1"><button class="btn btn-outline-danger"><span class="job_id">2029 : Job ID 887af0fe37ac42638035b1ce01a99b03</span></button></div></a><div aria-labelledby="job_list___sub_heading_2029_1" data-parent="#job_list___sub_accordion_2029" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2029_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=164" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (164, 39), end pos: (164, 40)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Lt_Gt, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -161,7 +161,7 @@ session_secret = result["result"] # Ensure it's a 32-character hex string - if len(session_secret) &lt; 32: + if len(session_secret) &gt; 32: session_secret = session_secret.zfill(32) elif len(session_secret) &gt; 32: session_secret = session_secret[:32]</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.21s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2030"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2030_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2030_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2030_1"><button class="btn btn-outline-success"><span class="job_id">2030 : Job ID 15b983ed70a0415dafa17ac2f87dff6f</span></button></div></a><div aria-labelledby="job_list___sub_heading_2030_1" data-parent="#job_list___sub_accordion_2030" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2030_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=164" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (164, 39), end pos: (164, 40)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Lt_GtE, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -161,7 +161,7 @@ session_secret = result["result"] # Ensure it's a 32-character hex string - if len(session_secret) &lt; 32: + if len(session_secret) &gt;= 32: session_secret = session_secret.zfill(32) elif len(session_secret) &gt; 32: session_secret = session_secret[:32]</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T020751700460Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T020752629868Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.43s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2031"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2031_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2031_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2031_1"><button class="btn btn-outline-danger"><span class="job_id">2031 : Job ID 4949cb00e00b458eba511939a4a550a8</span></button></div></a><div aria-labelledby="job_list___sub_heading_2031_1" data-parent="#job_list___sub_accordion_2031" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2031_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=166" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (166, 41), end pos: (166, 42)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_Eq, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -163,7 +163,7 @@ # Ensure it's a 32-character hex string if len(session_secret) &lt; 32: session_secret = session_secret.zfill(32) - elif len(session_secret) &gt; 32: + elif len(session_secret) == 32: session_secret = session_secret[:32] # Try to correlate with pending identity</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.05s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2032"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2032_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2032_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2032_1"><button class="btn btn-outline-danger"><span class="job_id">2032 : Job ID d0f10982d6b5430fa5c7996196902cc8</span></button></div></a><div aria-labelledby="job_list___sub_heading_2032_1" data-parent="#job_list___sub_accordion_2032" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2032_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=166" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (166, 41), end pos: (166, 42)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_NotEq, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -163,7 +163,7 @@ # Ensure it's a 32-character hex string if len(session_secret) &lt; 32: session_secret = session_secret.zfill(32) - elif len(session_secret) &gt; 32: + elif len(session_secret) != 32: session_secret = session_secret[:32] # Try to correlate with pending identity</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.27s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2033"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2033_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2033_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2033_1"><button class="btn btn-outline-danger"><span class="job_id">2033 : Job ID 21c5711053164c2592e9d4ea8f10ba9a</span></button></div></a><div aria-labelledby="job_list___sub_heading_2033_1" data-parent="#job_list___sub_accordion_2033" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2033_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=166" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (166, 41), end pos: (166, 42)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_Lt, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -163,7 +163,7 @@ # Ensure it's a 32-character hex string if len(session_secret) &lt; 32: session_secret = session_secret.zfill(32) - elif len(session_secret) &gt; 32: + elif len(session_secret) &lt; 32: session_secret = session_secret[:32] # Try to correlate with pending identity</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.58s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2034"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2034_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2034_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2034_1"><button class="btn btn-outline-success"><span class="job_id">2034 : Job ID 5a2e47ad319f4c2bb90cadec8b3931a2</span></button></div></a><div aria-labelledby="job_list___sub_heading_2034_1" data-parent="#job_list___sub_accordion_2034" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2034_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=166" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (166, 41), end pos: (166, 42)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_LtE, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -163,7 +163,7 @@ # Ensure it's a 32-character hex string if len(session_secret) &lt; 32: session_secret = session_secret.zfill(32) - elif len(session_secret) &gt; 32: + elif len(session_secret) &lt;= 32: session_secret = session_secret[:32] # Try to correlate with pending identity</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T013427965957Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T013428886887Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.32s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2035"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2035_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2035_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2035_1"><button class="btn btn-outline-success"><span class="job_id">2035 : Job ID 19805c6dd30b499d8d51d64bf3fefe19</span></button></div></a><div aria-labelledby="job_list___sub_heading_2035_1" data-parent="#job_list___sub_accordion_2035" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2035_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=166" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (166, 41), end pos: (166, 42)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_GtE, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -163,7 +163,7 @@ # Ensure it's a 32-character hex string if len(session_secret) &lt; 32: session_secret = session_secret.zfill(32) - elif len(session_secret) &gt; 32: + elif len(session_secret) &gt;= 32: session_secret = session_secret[:32] # Try to correlate with pending identity</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e514a370a2b400e0f: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.72s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2036"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2036_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2036_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2036_1"><button class="btn btn-outline-danger"><span class="job_id">2036 : Job ID b6ddac1238e3489ca70cfa2157b77f48</span></button></div></a><div aria-labelledby="job_list___sub_heading_2036_1" data-parent="#job_list___sub_accordion_2036" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2036_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=49" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (49, 27), end pos: (49, 29)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Is_IsNot, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -46,7 +46,7 @@ ] = {} # Store identity for each nonce_client during handshake # Set up paths for keys - if public_keys_dir is None: + if public_keys_dir is not None: # Default to public-keys/pki directory relative to server root server_root = Path(__file__).parent.parent public_keys_dir = str(server_root / "public-keys" / "pki")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.29s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2037"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2037_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2037_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2037_1"><button class="btn btn-outline-danger"><span class="job_id">2037 : Job ID b2b00a5711244c2fab6f1a2476b9cdfb</span></button></div></a><div aria-labelledby="job_list___sub_heading_2037_1" data-parent="#job_list___sub_accordion_2037" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2037_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=54" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (54, 30), end pos: (54, 32)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Is_IsNot, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -51,7 +51,7 @@ server_root = Path(__file__).parent.parent public_keys_dir = str(server_root / "public-keys" / "pki") - if server_private_key is None: + if server_private_key is not None: # Default to server_priv.asc in src directory server_private_key = str(Path(__file__).parent / "server_priv.asc") </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.13s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2038"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2038_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2038_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2038_1"><button class="btn btn-outline-danger"><span class="job_id">2038 : Job ID ece5fdc7310b429587f39fe6d5722e02</span></button></div></a><div aria-labelledby="job_list___sub_heading_2038_1" data-parent="#job_list___sub_accordion_2038" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2038_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=88" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (88, 32), end pos: (88, 38)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_IsNot_Is, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -85,7 +85,7 @@ if identity_data: nonce_client = identity_data.get("nonceClient") identity = identity_data.get("identity", "Unknown_Group") - if nonce_client is not None: + if nonce_client is None: # Store identity for later correlation with session secret self.pending_identities[nonce_client] = identity </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.69s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2039"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2039_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2039_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2039_1"><button class="btn btn-outline-danger"><span class="job_id">2039 : Job ID 1cf03c08659b4d55b9fb8b27d1a6a96f</span></button></div></a><div aria-labelledby="job_list___sub_heading_2039_1" data-parent="#job_list___sub_accordion_2039" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2039_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=105" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (105, 11), end pos: (105, 14)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -102,7 +102,7 @@ Decrypt message 1 payload to extract identity and nonce_client. This allows us to capture the identity before passing to RMAP library. """ - if not PGP_AVAILABLE: + if PGP_AVAILABLE: return None try:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.56s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2040"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2040_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2040_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2040_1"><button class="btn btn-outline-danger"><span class="job_id">2040 : Job ID de3be2d2436d40d59de0a14383b8a4f4</span></button></div></a><div aria-labelledby="job_list___sub_heading_2040_1" data-parent="#job_list___sub_accordion_2040" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2040_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=111" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (111, 15), end pos: (111, 18)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -108,7 +108,7 @@ try: # Load server private key for decryption server_private_key_path = str(Path(__file__).parent / "server_priv.asc") - if not Path(server_private_key_path).exists(): + if Path(server_private_key_path).exists(): return None # Load the private key</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.73s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2041"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2041_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2041_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2041_1"><button class="btn btn-outline-success"><span class="job_id">2041 : Job ID 49ac292b029c4d249b4f8dcc72cc80a0</span></button></div></a><div aria-labelledby="job_list___sub_heading_2041_1" data-parent="#job_list___sub_accordion_2041" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2041_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=120" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (120, 19), end pos: (120, 22)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -117,7 +117,7 @@ # Unlock the private key if it's protected if server_key.is_protected: passphrase = os.getenv("PRIVKEY_PASSPHRASE", "") - if not passphrase: + if passphrase: return None server_key.unlock(passphrase) </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T155725688698Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T155726573807Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.44s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2042"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2042_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2042_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2042_1"><button class="btn btn-outline-danger"><span class="job_id">2042 : Job ID 94b314b9f71f4879a18d376e03a61105</span></button></div></a><div aria-labelledby="job_list___sub_heading_2042_1" data-parent="#job_list___sub_accordion_2042" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2042_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=49" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (49, 11), end pos: (49, 34)</button></a></pre><pre>operator: core/AddNot, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -46,7 +46,7 @@ ] = {} # Store identity for each nonce_client during handshake # Set up paths for keys - if public_keys_dir is None: + if not public_keys_dir is None: # Default to public-keys/pki directory relative to server root server_root = Path(__file__).parent.parent public_keys_dir = str(server_root / "public-keys" / "pki")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.69s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2043"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2043_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2043_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2043_1"><button class="btn btn-outline-danger"><span class="job_id">2043 : Job ID 71175d897a2c4c01b09cb240209cff87</span></button></div></a><div aria-labelledby="job_list___sub_heading_2043_1" data-parent="#job_list___sub_accordion_2043" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2043_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=54" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (54, 11), end pos: (54, 37)</button></a></pre><pre>operator: core/AddNot, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -51,7 +51,7 @@ server_root = Path(__file__).parent.parent public_keys_dir = str(server_root / "public-keys" / "pki") - if server_private_key is None: + if not server_private_key is None: # Default to server_priv.asc in src directory server_private_key = str(Path(__file__).parent / "server_priv.asc") </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.37s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2044"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2044_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2044_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2044_1"><button class="btn btn-outline-success"><span class="job_id">2044 : Job ID 86c1053a21f5444f9f615414826c07e8</span></button></div></a><div aria-labelledby="job_list___sub_heading_2044_1" data-parent="#job_list___sub_accordion_2044" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2044_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=80" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (80, 15), end pos: (80, 40)</button></a></pre><pre>operator: core/AddNot, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -77,7 +77,7 @@ Returns: {"payload": "&lt;base64(encrypted_response)&gt;"} or {"error": "&lt;reason&gt;"} """ try: - if "payload" not in incoming: + if not "payload" not in incoming: return {"error": "payload is required"} # Try to extract identity from the payload before processing</pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse streamed [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse streamed [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 400 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 400 == 200 2 failed, 12 passed, 22 warnings in 16.31s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2045"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2045_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2045_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2045_1"><button class="btn btn-outline-success"><span class="job_id">2045 : Job ID 06eb3f06da0b4e21a587dba84904c668</span></button></div></a><div aria-labelledby="job_list___sub_heading_2045_1" data-parent="#job_list___sub_accordion_2045" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2045_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=85" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (85, 15), end pos: (85, 28)</button></a></pre><pre>operator: core/AddNot, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -82,7 +82,7 @@ # Try to extract identity from the payload before processing identity_data = self._decrypt_message1_payload(incoming["payload"]) - if identity_data: + if not identity_data: nonce_client = identity_data.get("nonceClient") identity = identity_data.get("identity", "Unknown_Group") if nonce_client is not None:</pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 503 == 200 2 failed, 12 passed, 22 warnings in 16.46s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2046"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2046_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2046_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2046_1"><button class="btn btn-outline-danger"><span class="job_id">2046 : Job ID 129906cb8da143ba822cede406017c44</span></button></div></a><div aria-labelledby="job_list___sub_heading_2046_1" data-parent="#job_list___sub_accordion_2046" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2046_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=88" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (88, 19), end pos: (88, 43)</button></a></pre><pre>operator: core/AddNot, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -85,7 +85,7 @@ if identity_data: nonce_client = identity_data.get("nonceClient") identity = identity_data.get("identity", "Unknown_Group") - if nonce_client is not None: + if not nonce_client is not None: # Store identity for later correlation with session secret self.pending_identities[nonce_client] = identity </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.80s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2047"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2047_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2047_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2047_1"><button class="btn btn-outline-success"><span class="job_id">2047 : Job ID 77478ae34c55499189267cd48de3a8f4</span></button></div></a><div aria-labelledby="job_list___sub_heading_2047_1" data-parent="#job_list___sub_accordion_2047" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2047_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=105" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (105, 11), end pos: (105, 28)</button></a></pre><pre>operator: core/AddNot, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -102,7 +102,7 @@ Decrypt message 1 payload to extract identity and nonce_client. This allows us to capture the identity before passing to RMAP library. """ - if not PGP_AVAILABLE: + if not not PGP_AVAILABLE: return None try:</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e4469e5e7111cba93: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.78s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2048"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2048_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2048_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2048_1"><button class="btn btn-outline-success"><span class="job_id">2048 : Job ID aadca603c5954d54b4f196c71646e3de</span></button></div></a><div aria-labelledby="job_list___sub_heading_2048_1" data-parent="#job_list___sub_accordion_2048" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2048_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=111" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (111, 15), end pos: (111, 57)</button></a></pre><pre>operator: core/AddNot, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -108,7 +108,7 @@ try: # Load server private key for decryption server_private_key_path = str(Path(__file__).parent / "server_priv.asc") - if not Path(server_private_key_path).exists(): + if not not Path(server_private_key_path).exists(): return None # Load the private key</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T045134170670Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T045135070609Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.78s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2049"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2049_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2049_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2049_1"><button class="btn btn-outline-success"><span class="job_id">2049 : Job ID 904a1742b39d4580b58f307e8175bcd7</span></button></div></a><div aria-labelledby="job_list___sub_heading_2049_1" data-parent="#job_list___sub_accordion_2049" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2049_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=118" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (118, 15), end pos: (118, 38)</button></a></pre><pre>operator: core/AddNot, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -115,7 +115,7 @@ server_key, _ = PGPKey.from_file(server_private_key_path) # Unlock the private key if it's protected - if server_key.is_protected: + if not server_key.is_protected: passphrase = os.getenv("PRIVKEY_PASSPHRASE", "") if not passphrase: return None</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e5e493bc171f65a5f: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.94s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2050"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2050_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2050_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2050_1"><button class="btn btn-outline-danger"><span class="job_id">2050 : Job ID 0d36c1486a7a45618072b1c12ea51dc3</span></button></div></a><div aria-labelledby="job_list___sub_heading_2050_1" data-parent="#job_list___sub_accordion_2050" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2050_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=120" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (120, 19), end pos: (120, 33)</button></a></pre><pre>operator: core/AddNot, occurrence: 8</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -117,7 +117,7 @@ # Unlock the private key if it's protected if server_key.is_protected: passphrase = os.getenv("PRIVKEY_PASSPHRASE", "") - if not passphrase: + if not not passphrase: return None server_key.unlock(passphrase) </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.66s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2051"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2051_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2051_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2051_1"><button class="btn btn-outline-success"><span class="job_id">2051 : Job ID 051035ab1be044a28266dcdfbdb3e46e</span></button></div></a><div aria-labelledby="job_list___sub_heading_2051_1" data-parent="#job_list___sub_accordion_2051" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2051_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=153" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (153, 15), end pos: (153, 40)</button></a></pre><pre>operator: core/AddNot, occurrence: 9</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -150,7 +150,7 @@ watermarked PDF. """ try: - if "payload" not in incoming: + if not "payload" not in incoming: return {"error": "payload is required"} # Use RMAP library to handle message 2</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T232506342344Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T232507238112Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 400 == 200 E + where 400 = &lt;WrapperTestResponse streamed [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:571: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 400 == 200 11 failed, 3 passed, 22 warnings in 18.59s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2052"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2052_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2052_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2052_1"><button class="btn btn-outline-danger"><span class="job_id">2052 : Job ID 71a4b7f700184b8284ab8e4401497851</span></button></div></a><div aria-labelledby="job_list___sub_heading_2052_1" data-parent="#job_list___sub_accordion_2052" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2052_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=160" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (160, 15), end pos: (160, 33)</button></a></pre><pre>operator: core/AddNot, occurrence: 10</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -157,7 +157,7 @@ # The library will return {"result": "hex_string"} or {"error": "message"} result = self.rmap.handle_message2(incoming) - if "result" in result: + if not "result" in result: session_secret = result["result"] # Ensure it's a 32-character hex string</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.99s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2053"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2053_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2053_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2053_1"><button class="btn btn-outline-success"><span class="job_id">2053 : Job ID a2a63df9251e4bae92f18dcb3bee2172</span></button></div></a><div aria-labelledby="job_list___sub_heading_2053_1" data-parent="#job_list___sub_accordion_2053" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2053_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=164" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (164, 19), end pos: (164, 43)</button></a></pre><pre>operator: core/AddNot, occurrence: 11</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -161,7 +161,7 @@ session_secret = result["result"] # Ensure it's a 32-character hex string - if len(session_secret) &lt; 32: + if not len(session_secret) &lt; 32: session_secret = session_secret.zfill(32) elif len(session_secret) &gt; 32: session_secret = session_secret[:32]</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T184138524237Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T184139387630Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.77s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2054"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2054_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2054_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2054_1"><button class="btn btn-outline-danger"><span class="job_id">2054 : Job ID 5a93d47a28d2416db0825bdf6719690b</span></button></div></a><div aria-labelledby="job_list___sub_heading_2054_1" data-parent="#job_list___sub_accordion_2054" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2054_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=173" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (173, 19), end pos: (173, 27)</button></a></pre><pre>operator: core/AddNot, occurrence: 12</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -170,7 +170,7 @@ # The session secret is (nonce_client &lt;&lt; 64) | nonce_server # We can try to find the matching identity identity = self._find_identity_for_session(session_secret) - if identity: + if not identity: self.session_identities[session_secret] = identity # Store watermark metadata for this session</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.45s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2055"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2055_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2055_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2055_1"><button class="btn btn-outline-success"><span class="job_id">2055 : Job ID 4ef833d54b314c1292a48dfb6cf606b4</span></button></div></a><div aria-labelledby="job_list___sub_heading_2055_1" data-parent="#job_list___sub_accordion_2055" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2055_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=197" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (197, 11), end pos: (197, 34)</button></a></pre><pre>operator: core/AddNot, occurrence: 13</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -194,7 +194,7 @@ """ # For simple cases where there's only one pending identity, # use it (works for single concurrent session) - if self.pending_identities: + if not self.pending_identities: # Use the first available identity and clear it identity = next(iter(self.pending_identities.values())) # Clear pending identities since we've used them</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:571: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 503 == 200 1 failed, 13 passed, 22 warnings in 22.09s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2056"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2056_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2056_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2056_1"><button class="btn btn-outline-danger"><span class="job_id">2056 : Job ID e2eaead839cc45c6a481f65a5194f671</span></button></div></a><div aria-labelledby="job_list___sub_heading_2056_1" data-parent="#job_list___sub_accordion_2056" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2056_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=23" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (23, 20), end pos: (23, 24)</button></a></pre><pre>operator: core/ReplaceTrueWithFalse, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -20,7 +20,7 @@ try: from pgpy import PGPKey, PGPMessage - PGP_AVAILABLE = True + PGP_AVAILABLE = False except ImportError: PGP_AVAILABLE = False </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.04s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2057"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2057_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2057_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2057_1"><button class="btn btn-outline-danger"><span class="job_id">2057 : Job ID 7228fdb7e76342b0b7463a38578eb1ed</span></button></div></a><div aria-labelledby="job_list___sub_heading_2057_1" data-parent="#job_list___sub_accordion_2057" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2057_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=179" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (179, 31), end pos: (179, 35)</button></a></pre><pre>operator: core/ReplaceTrueWithFalse, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -176,7 +176,7 @@ # Store watermark metadata for this session self.watermarked_pdfs[session_secret] = { "method": "robust-xmp", - "created": True, + "created": False, "session_secret": session_secret, } </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.14s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2058"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2058_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2058_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2058_1"><button class="btn btn-outline-danger"><span class="job_id">2058 : Job ID 8d15fcac9879407490ab8d397bdd7c4d</span></button></div></a><div aria-labelledby="job_list___sub_heading_2058_1" data-parent="#job_list___sub_accordion_2058" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2058_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=25" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (25, 20), end pos: (25, 25)</button></a></pre><pre>operator: core/ReplaceFalseWithTrue, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -22,7 +22,7 @@ PGP_AVAILABLE = True except ImportError: - PGP_AVAILABLE = False + PGP_AVAILABLE = True class SimpleRMAP:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.32s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2059"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2059_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2059_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2059_1"><button class="btn btn-outline-danger"><span class="job_id">2059 : Job ID 0b79a26a4bdf4014b8ef24469963f673</span></button></div></a><div aria-labelledby="job_list___sub_heading_2059_1" data-parent="#job_list___sub_accordion_2059" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2059_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=24" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (24, 7), end pos: (24, 18)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -21,7 +21,7 @@ from pgpy import PGPKey, PGPMessage PGP_AVAILABLE = True -except ImportError: +except CosmicRayTestingException: PGP_AVAILABLE = False </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.19s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2060"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2060_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2060_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2060_1"><button class="btn btn-outline-danger"><span class="job_id">2060 : Job ID a5ec8e5020114c4b9f973c00c2d834bb</span></button></div></a><div aria-labelledby="job_list___sub_heading_2060_1" data-parent="#job_list___sub_accordion_2060" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2060_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=97" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (97, 15), end pos: (97, 24)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -94,7 +94,7 @@ return result - except Exception as e: + except CosmicRayTestingException as e: return {"error": f"RMAP processing error: {str(e)}"} def _decrypt_message1_payload(self, payload: str) -&gt; dict[str, Any] | None:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.20s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2061"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2061_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2061_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2061_1"><button class="btn btn-outline-success"><span class="job_id">2061 : Job ID e326ef45c8264b25aec06ce9cfc66c0f</span></button></div></a><div aria-labelledby="job_list___sub_heading_2061_1" data-parent="#job_list___sub_accordion_2061" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2061_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=138" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (138, 15), end pos: (138, 24)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -135,7 +135,7 @@ return message_data - except Exception: + except CosmicRayTestingException: return None def handle_message2(self, incoming: dict[str, Any]) -&gt; dict[str, Any]:</pre></div><div class="alert alert-secondary"><pre class="diff">............FF [100%] ================================== FAILURES =================================== _____________________________ test_rmap_initiate ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_initiate(client): # Prepare payload test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) # Call route response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:513: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:553: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_initiate - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 503 == 200 2 failed, 12 passed, 22 warnings in 16.10s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2062"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2062_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2062_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2062_1"><button class="btn btn-outline-danger"><span class="job_id">2062 : Job ID b659b846e895441a903bad52f3dbaacd</span></button></div></a><div aria-labelledby="job_list___sub_heading_2062_1" data-parent="#job_list___sub_accordion_2062" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2062_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=187" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (187, 15), end pos: (187, 24)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -184,7 +184,7 @@ return result - except Exception as e: + except CosmicRayTestingException as e: return {"error": f"RMAP processing error: {str(e)}"} def _find_identity_for_session(self, session_secret: str) -&gt; str | None:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.10s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2063"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2063_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2063_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2063_1"><button class="btn btn-outline-danger"><span class="job_id">2063 : Job ID 4ba7eb1958724fd3a36e2281c57366a0</span></button></div></a><div aria-labelledby="job_list___sub_heading_2063_1" data-parent="#job_list___sub_accordion_2063" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2063_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=164" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (164, 41), end pos: (164, 43)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -161,7 +161,7 @@ session_secret = result["result"] # Ensure it's a 32-character hex string - if len(session_secret) &lt; 32: + if len(session_secret) &lt; 33: session_secret = session_secret.zfill(32) elif len(session_secret) &gt; 32: session_secret = session_secret[:32]</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.20s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2064"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2064_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2064_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2064_1"><button class="btn btn-outline-success"><span class="job_id">2064 : Job ID 258a116ae9d64480862577ab558088d5</span></button></div></a><div aria-labelledby="job_list___sub_heading_2064_1" data-parent="#job_list___sub_accordion_2064" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2064_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=164" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (164, 41), end pos: (164, 43)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -161,7 +161,7 @@ session_secret = result["result"] # Ensure it's a 32-character hex string - if len(session_secret) &lt; 32: + if len(session_secret) &lt; 31: session_secret = session_secret.zfill(32) elif len(session_secret) &gt; 32: session_secret = session_secret[:32]</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T020152706136Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T020153677015Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.46s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2065"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2065_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2065_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2065_1"><button class="btn btn-outline-danger"><span class="job_id">2065 : Job ID 21dcda10d8d3406f97322be1999fec00</span></button></div></a><div aria-labelledby="job_list___sub_heading_2065_1" data-parent="#job_list___sub_accordion_2065" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2065_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=165" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (165, 58), end pos: (165, 60)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -162,7 +162,7 @@ # Ensure it's a 32-character hex string if len(session_secret) &lt; 32: - session_secret = session_secret.zfill(32) + session_secret = session_secret.zfill( 33) elif len(session_secret) &gt; 32: session_secret = session_secret[:32] </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.77s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2066"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2066_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2066_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2066_1"><button class="btn btn-outline-success"><span class="job_id">2066 : Job ID 16867f5f4c844f968ba533974cacf7a2</span></button></div></a><div aria-labelledby="job_list___sub_heading_2066_1" data-parent="#job_list___sub_accordion_2066" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2066_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=165" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (165, 58), end pos: (165, 60)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -162,7 +162,7 @@ # Ensure it's a 32-character hex string if len(session_secret) &lt; 32: - session_secret = session_secret.zfill(32) + session_secret = session_secret.zfill( 31) elif len(session_secret) &gt; 32: session_secret = session_secret[:32] </pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e92cccf2a8bcb06cf: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.76s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2067"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2067_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2067_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2067_1"><button class="btn btn-outline-danger"><span class="job_id">2067 : Job ID 9da200a4837944de815176d4e80d0784</span></button></div></a><div aria-labelledby="job_list___sub_heading_2067_1" data-parent="#job_list___sub_accordion_2067" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2067_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=166" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (166, 43), end pos: (166, 45)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -163,7 +163,7 @@ # Ensure it's a 32-character hex string if len(session_secret) &lt; 32: session_secret = session_secret.zfill(32) - elif len(session_secret) &gt; 32: + elif len(session_secret) &gt; 33: session_secret = session_secret[:32] # Try to correlate with pending identity</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.31s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2068"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2068_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2068_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2068_1"><button class="btn btn-outline-danger"><span class="job_id">2068 : Job ID 7f17a69e3a494e22963419c81ada3021</span></button></div></a><div aria-labelledby="job_list___sub_heading_2068_1" data-parent="#job_list___sub_accordion_2068" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2068_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=166" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (166, 43), end pos: (166, 45)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -163,7 +163,7 @@ # Ensure it's a 32-character hex string if len(session_secret) &lt; 32: session_secret = session_secret.zfill(32) - elif len(session_secret) &gt; 32: + elif len(session_secret) &gt; 31: session_secret = session_secret[:32] # Try to correlate with pending identity</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.17s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2069"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2069_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2069_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2069_1"><button class="btn btn-outline-danger"><span class="job_id">2069 : Job ID e8a75142f39846a88e0c9de7fd217da3</span></button></div></a><div aria-labelledby="job_list___sub_heading_2069_1" data-parent="#job_list___sub_accordion_2069" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2069_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=167" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (167, 53), end pos: (167, 55)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -164,7 +164,7 @@ if len(session_secret) &lt; 32: session_secret = session_secret.zfill(32) elif len(session_secret) &gt; 32: - session_secret = session_secret[:32] + session_secret = session_secret[: 33] # Try to correlate with pending identity # The session secret is (nonce_client &lt;&lt; 64) | nonce_server</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.14s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2070"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2070_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2070_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2070_1"><button class="btn btn-outline-danger"><span class="job_id">2070 : Job ID d17e2978ec0442798a82f87cc67d9770</span></button></div></a><div aria-labelledby="job_list___sub_heading_2070_1" data-parent="#job_list___sub_accordion_2070" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2070_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=simple_rmap.py&amp;line=167" class="text-secondary"><button class="btn btn-outline-dark">simple_rmap.py, start pos: (167, 53), end pos: (167, 55)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- asimple_rmap.py +++ bsimple_rmap.py @@ -164,7 +164,7 @@ if len(session_secret) &lt; 32: session_secret = session_secret.zfill(32) elif len(session_secret) &gt; 32: - session_secret = session_secret[:32] + session_secret = session_secret[: 31] # Try to correlate with pending identity # The session secret is (nonce_client &lt;&lt; 64) | nonce_server</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.56s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2071"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2071_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2071_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2071_1"><button class="btn btn-outline-success"><span class="job_id">2071 : Job ID 30f634f317b54c26a5db896904c795b7</span></button></div></a><div aria-labelledby="job_list___sub_heading_2071_1" data-parent="#job_list___sub_accordion_2071" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2071_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=68" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (68, 27), end pos: (68, 28)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -65,7 +65,7 @@ METHODS[method.name] = method -def get_method(method: str | WatermarkingMethod) -&gt; WatermarkingMethod: +def get_method(method: str + WatermarkingMethod) -&gt; WatermarkingMethod: """Resolve a method from a string name or pass-through an instance. Raises</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T150330120300Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T150331011068Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.51s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2072"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2072_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2072_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2072_1"><button class="btn btn-outline-danger"><span class="job_id">2072 : Job ID 204ce4d5016e4367ae03bd0bd51edd96</span></button></div></a><div aria-labelledby="job_list___sub_heading_2072_1" data-parent="#job_list___sub_accordion_2072" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2072_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=92" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (92, 16), end pos: (92, 17)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -89,7 +89,7 @@ def apply_watermark( - method: str | WatermarkingMethod, + method: str + WatermarkingMethod, pdf: PdfSource, secret: str, key: str,</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.12s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2073"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2073_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2073_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2073_1"><button class="btn btn-outline-danger"><span class="job_id">2073 : Job ID a31494818a604e3c8e9534f13cba03ac</span></button></div></a><div aria-labelledby="job_list___sub_heading_2073_1" data-parent="#job_list___sub_accordion_2073" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2073_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=96" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (96, 22), end pos: (96, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -93,7 +93,7 @@ pdf: PdfSource, secret: str, key: str, - intended_for: str | None = None, + intended_for: str + None = None, position: str | None = None, ) -&gt; bytes: """Apply a watermark using the specified method and return new PDF bytes."""</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.10s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2074"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2074_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2074_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2074_1"><button class="btn btn-outline-success"><span class="job_id">2074 : Job ID 4a2a790169bc4f6fb287c5c341af517f</span></button></div></a><div aria-labelledby="job_list___sub_heading_2074_1" data-parent="#job_list___sub_accordion_2074" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2074_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=97" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (97, 18), end pos: (97, 19)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -94,7 +94,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str + None = None, ) -&gt; bytes: """Apply a watermark using the specified method and return new PDF bytes.""" m = get_method(method)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T032506098932Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T032507004147Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.44s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2075"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2075_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2075_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2075_1"><button class="btn btn-outline-success"><span class="job_id">2075 : Job ID 6817f926017f495580ed240423c4fe9c</span></button></div></a><div aria-labelledby="job_list___sub_heading_2075_1" data-parent="#job_list___sub_accordion_2075" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2075_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=107" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (107, 16), end pos: (107, 17)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -104,7 +104,7 @@ def is_watermarking_applicable( - method: str | WatermarkingMethod, + method: str + WatermarkingMethod, pdf: PdfSource, position: str | None = None, ) -&gt; bool:</pre></div><div class="alert alert-secondary"><pre class="diff">...F.......... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:228: in open request = self._request_from_builder_args(args, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:200: in _request_from_builder_args return builder.get_request() ^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:764: in get_request return cls(self.get_environ()) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:688: in get_environ input_stream, content_length, boundary = stream_encode_multipart( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:130: in stream_encode_multipart write_binary(encoder.send_event(Data(data=chunk, more_data=True))) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:81: in write_binary return stream.write(s) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... 1 failed, 13 passed, 22 warnings in 20.12s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2076"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2076_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2076_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2076_1"><button class="btn btn-outline-danger"><span class="job_id">2076 : Job ID 1b1f576fe3f84c19b3be9fcfc36da7af</span></button></div></a><div aria-labelledby="job_list___sub_heading_2076_1" data-parent="#job_list___sub_accordion_2076" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2076_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=109" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (109, 18), end pos: (109, 19)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -106,7 +106,7 @@ def is_watermarking_applicable( method: str | WatermarkingMethod, pdf: PdfSource, - position: str | None = None, + position: str + None = None, ) -&gt; bool: """Check if watermarking is applicable using the specified method.""" m = get_method(method)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.14s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2077"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2077_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2077_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2077_1"><button class="btn btn-outline-danger"><span class="job_id">2077 : Job ID 1acac7e590a44fc3ac0355cd12743a75</span></button></div></a><div aria-labelledby="job_list___sub_heading_2077_1" data-parent="#job_list___sub_accordion_2077" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2077_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=116" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (116, 31), end pos: (116, 32)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -113,7 +113,7 @@ return m.is_watermark_applicable(pdf=pdf, position=position) -def read_watermark(method: str | WatermarkingMethod, pdf: PdfSource, key: str) -&gt; str: +def read_watermark(method: str + WatermarkingMethod, pdf: PdfSource, key: str) -&gt; str: """Recover a secret from ``pdf`` using the specified method.""" m = get_method(method) return m.read_secret(pdf=pdf, key=key)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.02s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2078"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2078_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2078_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2078_1"><button class="btn btn-outline-success"><span class="job_id">2078 : Job ID 0aed43d6aeb54b8b945e0574055b8765</span></button></div></a><div aria-labelledby="job_list___sub_heading_2078_1" data-parent="#job_list___sub_accordion_2078" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2078_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=68" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (68, 27), end pos: (68, 28)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -65,7 +65,7 @@ METHODS[method.name] = method -def get_method(method: str | WatermarkingMethod) -&gt; WatermarkingMethod: +def get_method(method: str - WatermarkingMethod) -&gt; WatermarkingMethod: """Resolve a method from a string name or pass-through an instance. Raises</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e9fc3190b3d7cf498: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 20.96s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2079"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2079_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2079_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2079_1"><button class="btn btn-outline-danger"><span class="job_id">2079 : Job ID ee2aa32cbe0d4744ad0ebf490d0911d7</span></button></div></a><div aria-labelledby="job_list___sub_heading_2079_1" data-parent="#job_list___sub_accordion_2079" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2079_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=92" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (92, 16), end pos: (92, 17)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -89,7 +89,7 @@ def apply_watermark( - method: str | WatermarkingMethod, + method: str - WatermarkingMethod, pdf: PdfSource, secret: str, key: str,</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.99s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2080"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2080_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2080_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2080_1"><button class="btn btn-outline-danger"><span class="job_id">2080 : Job ID b26865961ffa4fcbbe5684960b4f7386</span></button></div></a><div aria-labelledby="job_list___sub_heading_2080_1" data-parent="#job_list___sub_accordion_2080" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2080_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=96" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (96, 22), end pos: (96, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -93,7 +93,7 @@ pdf: PdfSource, secret: str, key: str, - intended_for: str | None = None, + intended_for: str - None = None, position: str | None = None, ) -&gt; bytes: """Apply a watermark using the specified method and return new PDF bytes."""</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.78s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2081"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2081_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2081_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2081_1"><button class="btn btn-outline-danger"><span class="job_id">2081 : Job ID ad6b633453bd47019ac177a58688b66d</span></button></div></a><div aria-labelledby="job_list___sub_heading_2081_1" data-parent="#job_list___sub_accordion_2081" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2081_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=97" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (97, 18), end pos: (97, 19)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -94,7 +94,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str - None = None, ) -&gt; bytes: """Apply a watermark using the specified method and return new PDF bytes.""" m = get_method(method)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.21s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2082"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2082_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2082_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2082_1"><button class="btn btn-outline-danger"><span class="job_id">2082 : Job ID 1cc9677b5a7e434a84282fed328550b1</span></button></div></a><div aria-labelledby="job_list___sub_heading_2082_1" data-parent="#job_list___sub_accordion_2082" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2082_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=107" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (107, 16), end pos: (107, 17)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -104,7 +104,7 @@ def is_watermarking_applicable( - method: str | WatermarkingMethod, + method: str - WatermarkingMethod, pdf: PdfSource, position: str | None = None, ) -&gt; bool:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.10s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2083"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2083_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2083_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2083_1"><button class="btn btn-outline-danger"><span class="job_id">2083 : Job ID 9f15a81ab9474449afbcfdc4275a7932</span></button></div></a><div aria-labelledby="job_list___sub_heading_2083_1" data-parent="#job_list___sub_accordion_2083" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2083_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=109" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (109, 18), end pos: (109, 19)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -106,7 +106,7 @@ def is_watermarking_applicable( method: str | WatermarkingMethod, pdf: PdfSource, - position: str | None = None, + position: str - None = None, ) -&gt; bool: """Check if watermarking is applicable using the specified method.""" m = get_method(method)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.53s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2084"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2084_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2084_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2084_1"><button class="btn btn-outline-danger"><span class="job_id">2084 : Job ID 683c591f5a6b438ca3647971632d5d45</span></button></div></a><div aria-labelledby="job_list___sub_heading_2084_1" data-parent="#job_list___sub_accordion_2084" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2084_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=116" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (116, 31), end pos: (116, 32)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -113,7 +113,7 @@ return m.is_watermark_applicable(pdf=pdf, position=position) -def read_watermark(method: str | WatermarkingMethod, pdf: PdfSource, key: str) -&gt; str: +def read_watermark(method: str - WatermarkingMethod, pdf: PdfSource, key: str) -&gt; str: """Recover a secret from ``pdf`` using the specified method.""" m = get_method(method) return m.read_secret(pdf=pdf, key=key)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.42s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2085"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2085_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2085_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2085_1"><button class="btn btn-outline-danger"><span class="job_id">2085 : Job ID f084dfa51a744bbc815ecdb0600d586f</span></button></div></a><div aria-labelledby="job_list___sub_heading_2085_1" data-parent="#job_list___sub_accordion_2085" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2085_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=68" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (68, 27), end pos: (68, 28)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -65,7 +65,7 @@ METHODS[method.name] = method -def get_method(method: str | WatermarkingMethod) -&gt; WatermarkingMethod: +def get_method(method: str * WatermarkingMethod) -&gt; WatermarkingMethod: """Resolve a method from a string name or pass-through an instance. Raises</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.28s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2086"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2086_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2086_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2086_1"><button class="btn btn-outline-success"><span class="job_id">2086 : Job ID e8f0cee7f99c441da4bb3e296f7cdeaa</span></button></div></a><div aria-labelledby="job_list___sub_heading_2086_1" data-parent="#job_list___sub_accordion_2086" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2086_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=92" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (92, 16), end pos: (92, 17)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -89,7 +89,7 @@ def apply_watermark( - method: str | WatermarkingMethod, + method: str * WatermarkingMethod, pdf: PdfSource, secret: str, key: str,</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614eaf52f060e315350a: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.88s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2087"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2087_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2087_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2087_1"><button class="btn btn-outline-success"><span class="job_id">2087 : Job ID 179d323d74b04bad81964f5f3427b093</span></button></div></a><div aria-labelledby="job_list___sub_heading_2087_1" data-parent="#job_list___sub_accordion_2087" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2087_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=96" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (96, 22), end pos: (96, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -93,7 +93,7 @@ pdf: PdfSource, secret: str, key: str, - intended_for: str | None = None, + intended_for: str * None = None, position: str | None = None, ) -&gt; bytes: """Apply a watermark using the specified method and return new PDF bytes."""</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%]</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2088"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2088_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2088_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2088_1"><button class="btn btn-outline-danger"><span class="job_id">2088 : Job ID 4c05fb5c38254ba3919d7078890537e4</span></button></div></a><div aria-labelledby="job_list___sub_heading_2088_1" data-parent="#job_list___sub_accordion_2088" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2088_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=97" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (97, 18), end pos: (97, 19)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -94,7 +94,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str * None = None, ) -&gt; bytes: """Apply a watermark using the specified method and return new PDF bytes.""" m = get_method(method)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.02s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2089"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2089_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2089_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2089_1"><button class="btn btn-outline-success"><span class="job_id">2089 : Job ID d8591c8f914e46059730ea8be947c2d2</span></button></div></a><div aria-labelledby="job_list___sub_heading_2089_1" data-parent="#job_list___sub_accordion_2089" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2089_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=107" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (107, 16), end pos: (107, 17)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -104,7 +104,7 @@ def is_watermarking_applicable( - method: str | WatermarkingMethod, + method: str * WatermarkingMethod, pdf: PdfSource, position: str | None = None, ) -&gt; bool:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T050511100782Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T050512023426Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 21.09s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2090"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2090_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2090_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2090_1"><button class="btn btn-outline-danger"><span class="job_id">2090 : Job ID b56146251d9248f0a5e86a1a5a56616a</span></button></div></a><div aria-labelledby="job_list___sub_heading_2090_1" data-parent="#job_list___sub_accordion_2090" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2090_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=109" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (109, 18), end pos: (109, 19)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -106,7 +106,7 @@ def is_watermarking_applicable( method: str | WatermarkingMethod, pdf: PdfSource, - position: str | None = None, + position: str * None = None, ) -&gt; bool: """Check if watermarking is applicable using the specified method.""" m = get_method(method)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.11s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2091"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2091_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2091_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2091_1"><button class="btn btn-outline-success"><span class="job_id">2091 : Job ID f6def25306e04f6287ebf6f9216ca952</span></button></div></a><div aria-labelledby="job_list___sub_heading_2091_1" data-parent="#job_list___sub_accordion_2091" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2091_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=116" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (116, 31), end pos: (116, 32)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -113,7 +113,7 @@ return m.is_watermark_applicable(pdf=pdf, position=position) -def read_watermark(method: str | WatermarkingMethod, pdf: PdfSource, key: str) -&gt; str: +def read_watermark(method: str * WatermarkingMethod, pdf: PdfSource, key: str) -&gt; str: """Recover a secret from ``pdf`` using the specified method.""" m = get_method(method) return m.read_secret(pdf=pdf, key=key)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T180050445353Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T180051277805Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.40s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2092"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2092_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2092_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2092_1"><button class="btn btn-outline-danger"><span class="job_id">2092 : Job ID f47a9a8a0af445309da075903fae3131</span></button></div></a><div aria-labelledby="job_list___sub_heading_2092_1" data-parent="#job_list___sub_accordion_2092" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2092_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=68" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (68, 27), end pos: (68, 28)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -65,7 +65,7 @@ METHODS[method.name] = method -def get_method(method: str | WatermarkingMethod) -&gt; WatermarkingMethod: +def get_method(method: str / WatermarkingMethod) -&gt; WatermarkingMethod: """Resolve a method from a string name or pass-through an instance. Raises</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.18s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2093"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2093_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2093_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2093_1"><button class="btn btn-outline-danger"><span class="job_id">2093 : Job ID 09791ef791c447958882c4cd82467198</span></button></div></a><div aria-labelledby="job_list___sub_heading_2093_1" data-parent="#job_list___sub_accordion_2093" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2093_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=92" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (92, 16), end pos: (92, 17)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -89,7 +89,7 @@ def apply_watermark( - method: str | WatermarkingMethod, + method: str / WatermarkingMethod, pdf: PdfSource, secret: str, key: str,</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.54s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2094"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2094_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2094_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2094_1"><button class="btn btn-outline-success"><span class="job_id">2094 : Job ID 0bad2e1af5c14ff5926eb0aa12094ebe</span></button></div></a><div aria-labelledby="job_list___sub_heading_2094_1" data-parent="#job_list___sub_accordion_2094" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2094_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=96" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (96, 22), end pos: (96, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -93,7 +93,7 @@ pdf: PdfSource, secret: str, key: str, - intended_for: str | None = None, + intended_for: str / None = None, position: str | None = None, ) -&gt; bytes: """Apply a watermark using the specified method and return new PDF bytes."""</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T005040860595Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T005041848722Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.36s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2095"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2095_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2095_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2095_1"><button class="btn btn-outline-danger"><span class="job_id">2095 : Job ID e8633ac950f34783ade33646e6d9874f</span></button></div></a><div aria-labelledby="job_list___sub_heading_2095_1" data-parent="#job_list___sub_accordion_2095" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2095_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=97" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (97, 18), end pos: (97, 19)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -94,7 +94,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str / None = None, ) -&gt; bytes: """Apply a watermark using the specified method and return new PDF bytes.""" m = get_method(method)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.41s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2096"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2096_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2096_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2096_1"><button class="btn btn-outline-danger"><span class="job_id">2096 : Job ID bda171c8ec5b4773ae4069fcb378f6b1</span></button></div></a><div aria-labelledby="job_list___sub_heading_2096_1" data-parent="#job_list___sub_accordion_2096" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2096_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=107" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (107, 16), end pos: (107, 17)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -104,7 +104,7 @@ def is_watermarking_applicable( - method: str | WatermarkingMethod, + method: str / WatermarkingMethod, pdf: PdfSource, position: str | None = None, ) -&gt; bool:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.20s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2097"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2097_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2097_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2097_1"><button class="btn btn-outline-danger"><span class="job_id">2097 : Job ID b07753892f854cb4966580f0ddc24c13</span></button></div></a><div aria-labelledby="job_list___sub_heading_2097_1" data-parent="#job_list___sub_accordion_2097" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2097_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=109" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (109, 18), end pos: (109, 19)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -106,7 +106,7 @@ def is_watermarking_applicable( method: str | WatermarkingMethod, pdf: PdfSource, - position: str | None = None, + position: str / None = None, ) -&gt; bool: """Check if watermarking is applicable using the specified method.""" m = get_method(method)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.23s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2098"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2098_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2098_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2098_1"><button class="btn btn-outline-success"><span class="job_id">2098 : Job ID 25513b8940b342b28399e09fb7c2393e</span></button></div></a><div aria-labelledby="job_list___sub_heading_2098_1" data-parent="#job_list___sub_accordion_2098" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2098_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=116" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (116, 31), end pos: (116, 32)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -113,7 +113,7 @@ return m.is_watermark_applicable(pdf=pdf, position=position) -def read_watermark(method: str | WatermarkingMethod, pdf: PdfSource, key: str) -&gt; str: +def read_watermark(method: str / WatermarkingMethod, pdf: PdfSource, key: str) -&gt; str: """Recover a secret from ``pdf`` using the specified method.""" m = get_method(method) return m.read_secret(pdf=pdf, key=key)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T020334747869Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T020335673676Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.19s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2099"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2099_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2099_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2099_1"><button class="btn btn-outline-danger"><span class="job_id">2099 : Job ID e2481a0ae4bc46ee8ff10104ebacb334</span></button></div></a><div aria-labelledby="job_list___sub_heading_2099_1" data-parent="#job_list___sub_accordion_2099" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2099_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=68" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (68, 27), end pos: (68, 28)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -65,7 +65,7 @@ METHODS[method.name] = method -def get_method(method: str | WatermarkingMethod) -&gt; WatermarkingMethod: +def get_method(method: str // WatermarkingMethod) -&gt; WatermarkingMethod: """Resolve a method from a string name or pass-through an instance. Raises</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.18s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2100"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2100_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2100_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2100_1"><button class="btn btn-outline-danger"><span class="job_id">2100 : Job ID 8e3edf3a035c48b6b49099a1a8484223</span></button></div></a><div aria-labelledby="job_list___sub_heading_2100_1" data-parent="#job_list___sub_accordion_2100" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2100_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=92" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (92, 16), end pos: (92, 17)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -89,7 +89,7 @@ def apply_watermark( - method: str | WatermarkingMethod, + method: str // WatermarkingMethod, pdf: PdfSource, secret: str, key: str,</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.34s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2101"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2101_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2101_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2101_1"><button class="btn btn-outline-danger"><span class="job_id">2101 : Job ID b465b03885a94b7faf53d43ccacd9390</span></button></div></a><div aria-labelledby="job_list___sub_heading_2101_1" data-parent="#job_list___sub_accordion_2101" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2101_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=96" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (96, 22), end pos: (96, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -93,7 +93,7 @@ pdf: PdfSource, secret: str, key: str, - intended_for: str | None = None, + intended_for: str // None = None, position: str | None = None, ) -&gt; bytes: """Apply a watermark using the specified method and return new PDF bytes."""</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.94s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2102"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2102_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2102_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2102_1"><button class="btn btn-outline-danger"><span class="job_id">2102 : Job ID 7dd42ce43bdd497e88a513b671589eb6</span></button></div></a><div aria-labelledby="job_list___sub_heading_2102_1" data-parent="#job_list___sub_accordion_2102" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2102_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=97" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (97, 18), end pos: (97, 19)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -94,7 +94,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str // None = None, ) -&gt; bytes: """Apply a watermark using the specified method and return new PDF bytes.""" m = get_method(method)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.13s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2103"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2103_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2103_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2103_1"><button class="btn btn-outline-success"><span class="job_id">2103 : Job ID d0d776918bca4bfebcb8c206402a3d82</span></button></div></a><div aria-labelledby="job_list___sub_heading_2103_1" data-parent="#job_list___sub_accordion_2103" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2103_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=107" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (107, 16), end pos: (107, 17)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -104,7 +104,7 @@ def is_watermarking_applicable( - method: str | WatermarkingMethod, + method: str // WatermarkingMethod, pdf: PdfSource, position: str | None = None, ) -&gt; bool:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T175213532607Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T175214470029Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.43s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2104"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2104_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2104_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2104_1"><button class="btn btn-outline-danger"><span class="job_id">2104 : Job ID bd9eaaa11f6d4080ab7ab7fcd3138ecd</span></button></div></a><div aria-labelledby="job_list___sub_heading_2104_1" data-parent="#job_list___sub_accordion_2104" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2104_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=109" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (109, 18), end pos: (109, 19)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -106,7 +106,7 @@ def is_watermarking_applicable( method: str | WatermarkingMethod, pdf: PdfSource, - position: str | None = None, + position: str // None = None, ) -&gt; bool: """Check if watermarking is applicable using the specified method.""" m = get_method(method)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.74s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2105"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2105_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2105_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2105_1"><button class="btn btn-outline-danger"><span class="job_id">2105 : Job ID 5450e016863e42b1a328a28b14cfada6</span></button></div></a><div aria-labelledby="job_list___sub_heading_2105_1" data-parent="#job_list___sub_accordion_2105" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2105_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=116" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (116, 31), end pos: (116, 32)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -113,7 +113,7 @@ return m.is_watermark_applicable(pdf=pdf, position=position) -def read_watermark(method: str | WatermarkingMethod, pdf: PdfSource, key: str) -&gt; str: +def read_watermark(method: str // WatermarkingMethod, pdf: PdfSource, key: str) -&gt; str: """Recover a secret from ``pdf`` using the specified method.""" m = get_method(method) return m.read_secret(pdf=pdf, key=key)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.24s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2106"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2106_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2106_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2106_1"><button class="btn btn-outline-success"><span class="job_id">2106 : Job ID 7bf84ec09bb947918d94c6c4e3f2ecf9</span></button></div></a><div aria-labelledby="job_list___sub_heading_2106_1" data-parent="#job_list___sub_accordion_2106" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2106_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=68" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (68, 27), end pos: (68, 28)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -65,7 +65,7 @@ METHODS[method.name] = method -def get_method(method: str | WatermarkingMethod) -&gt; WatermarkingMethod: +def get_method(method: str % WatermarkingMethod) -&gt; WatermarkingMethod: """Resolve a method from a string name or pass-through an instance. Raises</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T174906641770Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T174907455316Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.32s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2107"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2107_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2107_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2107_1"><button class="btn btn-outline-success"><span class="job_id">2107 : Job ID 37c8a05af3824ad5b08d3c37d1544202</span></button></div></a><div aria-labelledby="job_list___sub_heading_2107_1" data-parent="#job_list___sub_accordion_2107" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2107_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=92" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (92, 16), end pos: (92, 17)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -89,7 +89,7 @@ def apply_watermark( - method: str | WatermarkingMethod, + method: str % WatermarkingMethod, pdf: PdfSource, secret: str, key: str,</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ea20803a3979f63cb: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.81s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2108"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2108_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2108_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2108_1"><button class="btn btn-outline-danger"><span class="job_id">2108 : Job ID 90500b20c4e6486b94d0e431e42b3193</span></button></div></a><div aria-labelledby="job_list___sub_heading_2108_1" data-parent="#job_list___sub_accordion_2108" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2108_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=96" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (96, 22), end pos: (96, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -93,7 +93,7 @@ pdf: PdfSource, secret: str, key: str, - intended_for: str | None = None, + intended_for: str % None = None, position: str | None = None, ) -&gt; bytes: """Apply a watermark using the specified method and return new PDF bytes."""</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.29s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2109"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2109_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2109_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2109_1"><button class="btn btn-outline-success"><span class="job_id">2109 : Job ID 05d3d0b809c54b508d140f078eb6bc8f</span></button></div></a><div aria-labelledby="job_list___sub_heading_2109_1" data-parent="#job_list___sub_accordion_2109" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2109_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=97" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (97, 18), end pos: (97, 19)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -94,7 +94,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str % None = None, ) -&gt; bytes: """Apply a watermark using the specified method and return new PDF bytes.""" m = get_method(method)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T225854547758Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T225855523096Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.57s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2110"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2110_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2110_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2110_1"><button class="btn btn-outline-success"><span class="job_id">2110 : Job ID 3918625993c245dd99e9bba6754ea3ca</span></button></div></a><div aria-labelledby="job_list___sub_heading_2110_1" data-parent="#job_list___sub_accordion_2110" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2110_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=107" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (107, 16), end pos: (107, 17)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -104,7 +104,7 @@ def is_watermarking_applicable( - method: str | WatermarkingMethod, + method: str % WatermarkingMethod, pdf: PdfSource, position: str | None = None, ) -&gt; bool:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T224434356021Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T224435179697Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.57s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2111"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2111_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2111_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2111_1"><button class="btn btn-outline-success"><span class="job_id">2111 : Job ID d676f33152ee489eaba640c1bcb01a34</span></button></div></a><div aria-labelledby="job_list___sub_heading_2111_1" data-parent="#job_list___sub_accordion_2111" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2111_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=109" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (109, 18), end pos: (109, 19)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -106,7 +106,7 @@ def is_watermarking_applicable( method: str | WatermarkingMethod, pdf: PdfSource, - position: str | None = None, + position: str % None = None, ) -&gt; bool: """Check if watermarking is applicable using the specified method.""" m = get_method(method)</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ec892c0c1370b2b62: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.67s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2112"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2112_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2112_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2112_1"><button class="btn btn-outline-success"><span class="job_id">2112 : Job ID 3207988658c848f49c7f8fdc588b5df1</span></button></div></a><div aria-labelledby="job_list___sub_heading_2112_1" data-parent="#job_list___sub_accordion_2112" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2112_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=116" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (116, 31), end pos: (116, 32)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -113,7 +113,7 @@ return m.is_watermark_applicable(pdf=pdf, position=position) -def read_watermark(method: str | WatermarkingMethod, pdf: PdfSource, key: str) -&gt; str: +def read_watermark(method: str % WatermarkingMethod, pdf: PdfSource, key: str) -&gt; str: """Recover a secret from ``pdf`` using the specified method.""" m = get_method(method) return m.read_secret(pdf=pdf, key=key)</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 4 failed, 10 passed, 22 warnings in 22.05s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2113"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2113_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2113_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2113_1"><button class="btn btn-outline-danger"><span class="job_id">2113 : Job ID ab9592bd95d74f6ba6681f3ec6893916</span></button></div></a><div aria-labelledby="job_list___sub_heading_2113_1" data-parent="#job_list___sub_accordion_2113" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2113_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=68" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (68, 27), end pos: (68, 28)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -65,7 +65,7 @@ METHODS[method.name] = method -def get_method(method: str | WatermarkingMethod) -&gt; WatermarkingMethod: +def get_method(method: str ** WatermarkingMethod) -&gt; WatermarkingMethod: """Resolve a method from a string name or pass-through an instance. Raises</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.37s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2114"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2114_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2114_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2114_1"><button class="btn btn-outline-danger"><span class="job_id">2114 : Job ID c0cc9c64cabf4b57ab0f5e41c0ac8bb3</span></button></div></a><div aria-labelledby="job_list___sub_heading_2114_1" data-parent="#job_list___sub_accordion_2114" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2114_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=92" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (92, 16), end pos: (92, 17)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -89,7 +89,7 @@ def apply_watermark( - method: str | WatermarkingMethod, + method: str ** WatermarkingMethod, pdf: PdfSource, secret: str, key: str,</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.40s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2115"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2115_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2115_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2115_1"><button class="btn btn-outline-danger"><span class="job_id">2115 : Job ID c7574930ae76451eadf10b363445fac8</span></button></div></a><div aria-labelledby="job_list___sub_heading_2115_1" data-parent="#job_list___sub_accordion_2115" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2115_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=96" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (96, 22), end pos: (96, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -93,7 +93,7 @@ pdf: PdfSource, secret: str, key: str, - intended_for: str | None = None, + intended_for: str ** None = None, position: str | None = None, ) -&gt; bytes: """Apply a watermark using the specified method and return new PDF bytes."""</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.54s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2116"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2116_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2116_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2116_1"><button class="btn btn-outline-success"><span class="job_id">2116 : Job ID 73fda8a60d79488aa8d1df465e2f4d5c</span></button></div></a><div aria-labelledby="job_list___sub_heading_2116_1" data-parent="#job_list___sub_accordion_2116" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2116_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=97" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (97, 18), end pos: (97, 19)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -94,7 +94,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str ** None = None, ) -&gt; bytes: """Apply a watermark using the specified method and return new PDF bytes.""" m = get_method(method)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T231039590409Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T231040471496Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.39s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2117"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2117_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2117_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2117_1"><button class="btn btn-outline-danger"><span class="job_id">2117 : Job ID d59c64cf4f6947c68db703eca7f35973</span></button></div></a><div aria-labelledby="job_list___sub_heading_2117_1" data-parent="#job_list___sub_accordion_2117" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2117_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=107" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (107, 16), end pos: (107, 17)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -104,7 +104,7 @@ def is_watermarking_applicable( - method: str | WatermarkingMethod, + method: str ** WatermarkingMethod, pdf: PdfSource, position: str | None = None, ) -&gt; bool:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.46s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2118"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2118_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2118_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2118_1"><button class="btn btn-outline-success"><span class="job_id">2118 : Job ID 46fd2671734044828e23c8ac7f889e85</span></button></div></a><div aria-labelledby="job_list___sub_heading_2118_1" data-parent="#job_list___sub_accordion_2118" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2118_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=109" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (109, 18), end pos: (109, 19)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -106,7 +106,7 @@ def is_watermarking_applicable( method: str | WatermarkingMethod, pdf: PdfSource, - position: str | None = None, + position: str ** None = None, ) -&gt; bool: """Check if watermarking is applicable using the specified method.""" m = get_method(method)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T005243807186Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T005244679974Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.39s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2119"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2119_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2119_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2119_1"><button class="btn btn-outline-success"><span class="job_id">2119 : Job ID e950013dff98497fb67087820f1f0888</span></button></div></a><div aria-labelledby="job_list___sub_heading_2119_1" data-parent="#job_list___sub_accordion_2119" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2119_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=116" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (116, 31), end pos: (116, 32)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -113,7 +113,7 @@ return m.is_watermark_applicable(pdf=pdf, position=position) -def read_watermark(method: str | WatermarkingMethod, pdf: PdfSource, key: str) -&gt; str: +def read_watermark(method: str ** WatermarkingMethod, pdf: PdfSource, key: str) -&gt; str: """Recover a secret from ``pdf`` using the specified method.""" m = get_method(method) return m.read_secret(pdf=pdf, key=key)</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ecb05cadd8d9b977c: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 22.04s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2120"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2120_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2120_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2120_1"><button class="btn btn-outline-success"><span class="job_id">2120 : Job ID 4ae3b67ffc11467494402ef6fd997e56</span></button></div></a><div aria-labelledby="job_list___sub_heading_2120_1" data-parent="#job_list___sub_accordion_2120" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2120_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=68" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (68, 27), end pos: (68, 28)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -65,7 +65,7 @@ METHODS[method.name] = method -def get_method(method: str | WatermarkingMethod) -&gt; WatermarkingMethod: +def get_method(method: str &gt;&gt; WatermarkingMethod) -&gt; WatermarkingMethod: """Resolve a method from a string name or pass-through an instance. Raises</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T172616604371Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T172617524486Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.45s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2121"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2121_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2121_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2121_1"><button class="btn btn-outline-danger"><span class="job_id">2121 : Job ID 6fee8119b5ca4d6098f43a929fb5985d</span></button></div></a><div aria-labelledby="job_list___sub_heading_2121_1" data-parent="#job_list___sub_accordion_2121" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2121_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=92" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (92, 16), end pos: (92, 17)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -89,7 +89,7 @@ def apply_watermark( - method: str | WatermarkingMethod, + method: str &gt;&gt; WatermarkingMethod, pdf: PdfSource, secret: str, key: str,</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.74s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2122"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2122_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2122_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2122_1"><button class="btn btn-outline-success"><span class="job_id">2122 : Job ID 1093335c9bb0449287914b66a68f81fd</span></button></div></a><div aria-labelledby="job_list___sub_heading_2122_1" data-parent="#job_list___sub_accordion_2122" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2122_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=96" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (96, 22), end pos: (96, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -93,7 +93,7 @@ pdf: PdfSource, secret: str, key: str, - intended_for: str | None = None, + intended_for: str &gt;&gt; None = None, position: str | None = None, ) -&gt; bytes: """Apply a watermark using the specified method and return new PDF bytes."""</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T231405733092Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T231406646870Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.36s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2123"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2123_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2123_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2123_1"><button class="btn btn-outline-danger"><span class="job_id">2123 : Job ID c5733bc96c90472aa1cb65f76f04b102</span></button></div></a><div aria-labelledby="job_list___sub_heading_2123_1" data-parent="#job_list___sub_accordion_2123" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2123_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=97" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (97, 18), end pos: (97, 19)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -94,7 +94,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str &gt;&gt; None = None, ) -&gt; bytes: """Apply a watermark using the specified method and return new PDF bytes.""" m = get_method(method)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.16s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2124"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2124_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2124_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2124_1"><button class="btn btn-outline-danger"><span class="job_id">2124 : Job ID e1f14f68c9fd486ba46d8bdc2a0dd2cc</span></button></div></a><div aria-labelledby="job_list___sub_heading_2124_1" data-parent="#job_list___sub_accordion_2124" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2124_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=107" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (107, 16), end pos: (107, 17)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -104,7 +104,7 @@ def is_watermarking_applicable( - method: str | WatermarkingMethod, + method: str &gt;&gt; WatermarkingMethod, pdf: PdfSource, position: str | None = None, ) -&gt; bool:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.99s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2125"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2125_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2125_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2125_1"><button class="btn btn-outline-success"><span class="job_id">2125 : Job ID d5d08fde464b48778d26a5252f9abf75</span></button></div></a><div aria-labelledby="job_list___sub_heading_2125_1" data-parent="#job_list___sub_accordion_2125" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2125_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=109" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (109, 18), end pos: (109, 19)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -106,7 +106,7 @@ def is_watermarking_applicable( method: str | WatermarkingMethod, pdf: PdfSource, - position: str | None = None, + position: str &gt;&gt; None = None, ) -&gt; bool: """Check if watermarking is applicable using the specified method.""" m = get_method(method)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T205333758395Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T205335089018Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 23.17s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2126"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2126_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2126_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2126_1"><button class="btn btn-outline-success"><span class="job_id">2126 : Job ID 8ae6b8fee3244f7099c7277fb0e1d72b</span></button></div></a><div aria-labelledby="job_list___sub_heading_2126_1" data-parent="#job_list___sub_accordion_2126" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2126_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=116" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (116, 31), end pos: (116, 32)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -113,7 +113,7 @@ return m.is_watermark_applicable(pdf=pdf, position=position) -def read_watermark(method: str | WatermarkingMethod, pdf: PdfSource, key: str) -&gt; str: +def read_watermark(method: str &gt;&gt; WatermarkingMethod, pdf: PdfSource, key: str) -&gt; str: """Recover a secret from ``pdf`` using the specified method.""" m = get_method(method) return m.read_secret(pdf=pdf, key=key)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T155847885422Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T155848803307Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.34s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2127"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2127_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2127_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2127_1"><button class="btn btn-outline-danger"><span class="job_id">2127 : Job ID 01f5be753c594f7cbe4b4953d0ccdfc1</span></button></div></a><div aria-labelledby="job_list___sub_heading_2127_1" data-parent="#job_list___sub_accordion_2127" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2127_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=68" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (68, 27), end pos: (68, 28)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -65,7 +65,7 @@ METHODS[method.name] = method -def get_method(method: str | WatermarkingMethod) -&gt; WatermarkingMethod: +def get_method(method: str &lt;&lt; WatermarkingMethod) -&gt; WatermarkingMethod: """Resolve a method from a string name or pass-through an instance. Raises</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.09s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2128"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2128_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2128_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2128_1"><button class="btn btn-outline-success"><span class="job_id">2128 : Job ID ffe595001d73498a98028ac1af3a8670</span></button></div></a><div aria-labelledby="job_list___sub_heading_2128_1" data-parent="#job_list___sub_accordion_2128" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2128_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=92" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (92, 16), end pos: (92, 17)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -89,7 +89,7 @@ def apply_watermark( - method: str | WatermarkingMethod, + method: str &lt;&lt; WatermarkingMethod, pdf: PdfSource, secret: str, key: str,</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T150712723160Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T150713640790Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.33s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2129"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2129_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2129_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2129_1"><button class="btn btn-outline-success"><span class="job_id">2129 : Job ID 3d5cfa1e46ff4e82bc0d0806d66f1c74</span></button></div></a><div aria-labelledby="job_list___sub_heading_2129_1" data-parent="#job_list___sub_accordion_2129" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2129_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=96" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (96, 22), end pos: (96, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -93,7 +93,7 @@ pdf: PdfSource, secret: str, key: str, - intended_for: str | None = None, + intended_for: str &lt;&lt; None = None, position: str | None = None, ) -&gt; bytes: """Apply a watermark using the specified method and return new PDF bytes."""</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T213122418981Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T213123317126Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.35s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2130"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2130_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2130_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2130_1"><button class="btn btn-outline-success"><span class="job_id">2130 : Job ID 5d9f0dab63034b4bb3167258d4a8eea1</span></button></div></a><div aria-labelledby="job_list___sub_heading_2130_1" data-parent="#job_list___sub_accordion_2130" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2130_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=97" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (97, 18), end pos: (97, 19)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -94,7 +94,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str &lt;&lt; None = None, ) -&gt; bytes: """Apply a watermark using the specified method and return new PDF bytes.""" m = get_method(method)</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614eeacf98f50aba8e77: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.68s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2131"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2131_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2131_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2131_1"><button class="btn btn-outline-danger"><span class="job_id">2131 : Job ID d72a774199c04552b280cea8b63f12d0</span></button></div></a><div aria-labelledby="job_list___sub_heading_2131_1" data-parent="#job_list___sub_accordion_2131" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2131_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=107" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (107, 16), end pos: (107, 17)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -104,7 +104,7 @@ def is_watermarking_applicable( - method: str | WatermarkingMethod, + method: str &lt;&lt; WatermarkingMethod, pdf: PdfSource, position: str | None = None, ) -&gt; bool:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.14s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2132"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2132_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2132_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2132_1"><button class="btn btn-outline-success"><span class="job_id">2132 : Job ID 281e4d3cb4084e58b8d157e8cefbda5f</span></button></div></a><div aria-labelledby="job_list___sub_heading_2132_1" data-parent="#job_list___sub_accordion_2132" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2132_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=109" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (109, 18), end pos: (109, 19)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -106,7 +106,7 @@ def is_watermarking_applicable( method: str | WatermarkingMethod, pdf: PdfSource, - position: str | None = None, + position: str &lt;&lt; None = None, ) -&gt; bool: """Check if watermarking is applicable using the specified method.""" m = get_method(method)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T213429337253Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T213430242936Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.42s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2133"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2133_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2133_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2133_1"><button class="btn btn-outline-success"><span class="job_id">2133 : Job ID 78c6be1034b44fd1b5d5cfc759274d8e</span></button></div></a><div aria-labelledby="job_list___sub_heading_2133_1" data-parent="#job_list___sub_accordion_2133" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2133_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=116" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (116, 31), end pos: (116, 32)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -113,7 +113,7 @@ return m.is_watermark_applicable(pdf=pdf, position=position) -def read_watermark(method: str | WatermarkingMethod, pdf: PdfSource, key: str) -&gt; str: +def read_watermark(method: str &lt;&lt; WatermarkingMethod, pdf: PdfSource, key: str) -&gt; str: """Recover a secret from ``pdf`` using the specified method.""" m = get_method(method) return m.read_secret(pdf=pdf, key=key)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T001903101197Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T001903990649Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.48s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2134"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2134_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2134_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2134_1"><button class="btn btn-outline-success"><span class="job_id">2134 : Job ID 2ac9e0f95d5c42f098972ea2845015cf</span></button></div></a><div aria-labelledby="job_list___sub_heading_2134_1" data-parent="#job_list___sub_accordion_2134" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2134_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=68" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (68, 27), end pos: (68, 28)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -65,7 +65,7 @@ METHODS[method.name] = method -def get_method(method: str | WatermarkingMethod) -&gt; WatermarkingMethod: +def get_method(method: str &amp; WatermarkingMethod) -&gt; WatermarkingMethod: """Resolve a method from a string name or pass-through an instance. Raises</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T163811174112Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T163812034672Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.20s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2135"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2135_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2135_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2135_1"><button class="btn btn-outline-danger"><span class="job_id">2135 : Job ID 3620250da7ee43ec93ab3ac0d1b4d3bf</span></button></div></a><div aria-labelledby="job_list___sub_heading_2135_1" data-parent="#job_list___sub_accordion_2135" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2135_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=92" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (92, 16), end pos: (92, 17)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -89,7 +89,7 @@ def apply_watermark( - method: str | WatermarkingMethod, + method: str &amp; WatermarkingMethod, pdf: PdfSource, secret: str, key: str,</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.48s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2136"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2136_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2136_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2136_1"><button class="btn btn-outline-danger"><span class="job_id">2136 : Job ID 22fe67a95a744659bed850f0a9ce204d</span></button></div></a><div aria-labelledby="job_list___sub_heading_2136_1" data-parent="#job_list___sub_accordion_2136" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2136_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=96" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (96, 22), end pos: (96, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -93,7 +93,7 @@ pdf: PdfSource, secret: str, key: str, - intended_for: str | None = None, + intended_for: str &amp; None = None, position: str | None = None, ) -&gt; bytes: """Apply a watermark using the specified method and return new PDF bytes."""</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.55s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2137"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2137_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2137_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2137_1"><button class="btn btn-outline-danger"><span class="job_id">2137 : Job ID 381c11884d7a43888298a3bc48097355</span></button></div></a><div aria-labelledby="job_list___sub_heading_2137_1" data-parent="#job_list___sub_accordion_2137" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2137_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=97" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (97, 18), end pos: (97, 19)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -94,7 +94,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str &amp; None = None, ) -&gt; bytes: """Apply a watermark using the specified method and return new PDF bytes.""" m = get_method(method)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.03s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2138"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2138_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2138_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2138_1"><button class="btn btn-outline-danger"><span class="job_id">2138 : Job ID cd0951d2e00e4b32950dd11a4b7f1b5b</span></button></div></a><div aria-labelledby="job_list___sub_heading_2138_1" data-parent="#job_list___sub_accordion_2138" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2138_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=107" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (107, 16), end pos: (107, 17)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -104,7 +104,7 @@ def is_watermarking_applicable( - method: str | WatermarkingMethod, + method: str &amp; WatermarkingMethod, pdf: PdfSource, position: str | None = None, ) -&gt; bool:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.56s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2139"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2139_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2139_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2139_1"><button class="btn btn-outline-danger"><span class="job_id">2139 : Job ID 78f555248d2c4d82840a82774371a432</span></button></div></a><div aria-labelledby="job_list___sub_heading_2139_1" data-parent="#job_list___sub_accordion_2139" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2139_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=109" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (109, 18), end pos: (109, 19)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -106,7 +106,7 @@ def is_watermarking_applicable( method: str | WatermarkingMethod, pdf: PdfSource, - position: str | None = None, + position: str &amp; None = None, ) -&gt; bool: """Check if watermarking is applicable using the specified method.""" m = get_method(method)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.97s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2140"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2140_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2140_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2140_1"><button class="btn btn-outline-danger"><span class="job_id">2140 : Job ID 06433f5741f442b4b44d825bba67b2d5</span></button></div></a><div aria-labelledby="job_list___sub_heading_2140_1" data-parent="#job_list___sub_accordion_2140" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2140_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=116" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (116, 31), end pos: (116, 32)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -113,7 +113,7 @@ return m.is_watermark_applicable(pdf=pdf, position=position) -def read_watermark(method: str | WatermarkingMethod, pdf: PdfSource, key: str) -&gt; str: +def read_watermark(method: str &amp; WatermarkingMethod, pdf: PdfSource, key: str) -&gt; str: """Recover a secret from ``pdf`` using the specified method.""" m = get_method(method) return m.read_secret(pdf=pdf, key=key)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.13s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2141"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2141_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2141_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2141_1"><button class="btn btn-outline-danger"><span class="job_id">2141 : Job ID 828cd194b7b84c7292e08005a2074640</span></button></div></a><div aria-labelledby="job_list___sub_heading_2141_1" data-parent="#job_list___sub_accordion_2141" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2141_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=68" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (68, 27), end pos: (68, 28)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -65,7 +65,7 @@ METHODS[method.name] = method -def get_method(method: str | WatermarkingMethod) -&gt; WatermarkingMethod: +def get_method(method: str ^ WatermarkingMethod) -&gt; WatermarkingMethod: """Resolve a method from a string name or pass-through an instance. Raises</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.01s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2142"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2142_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2142_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2142_1"><button class="btn btn-outline-danger"><span class="job_id">2142 : Job ID 1d25b1855ae1417ba285879def7491fc</span></button></div></a><div aria-labelledby="job_list___sub_heading_2142_1" data-parent="#job_list___sub_accordion_2142" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2142_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=92" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (92, 16), end pos: (92, 17)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -89,7 +89,7 @@ def apply_watermark( - method: str | WatermarkingMethod, + method: str ^ WatermarkingMethod, pdf: PdfSource, secret: str, key: str,</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.55s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2143"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2143_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2143_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2143_1"><button class="btn btn-outline-success"><span class="job_id">2143 : Job ID d8ff69fae3644a2294b826c2634f99fb</span></button></div></a><div aria-labelledby="job_list___sub_heading_2143_1" data-parent="#job_list___sub_accordion_2143" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2143_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=96" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (96, 22), end pos: (96, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -93,7 +93,7 @@ pdf: PdfSource, secret: str, key: str, - intended_for: str | None = None, + intended_for: str ^ None = None, position: str | None = None, ) -&gt; bytes: """Apply a watermark using the specified method and return new PDF bytes."""</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T212409567222Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T212410673593Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 20.72s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2144"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2144_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2144_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2144_1"><button class="btn btn-outline-danger"><span class="job_id">2144 : Job ID a77aa531fdd74176ad9235ec915335b1</span></button></div></a><div aria-labelledby="job_list___sub_heading_2144_1" data-parent="#job_list___sub_accordion_2144" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2144_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=97" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (97, 18), end pos: (97, 19)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -94,7 +94,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str ^ None = None, ) -&gt; bytes: """Apply a watermark using the specified method and return new PDF bytes.""" m = get_method(method)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.62s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2145"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2145_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2145_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2145_1"><button class="btn btn-outline-danger"><span class="job_id">2145 : Job ID 492fd860400c4cc4bd1da66bb514643f</span></button></div></a><div aria-labelledby="job_list___sub_heading_2145_1" data-parent="#job_list___sub_accordion_2145" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2145_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=107" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (107, 16), end pos: (107, 17)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -104,7 +104,7 @@ def is_watermarking_applicable( - method: str | WatermarkingMethod, + method: str ^ WatermarkingMethod, pdf: PdfSource, position: str | None = None, ) -&gt; bool:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.05s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2146"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2146_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2146_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2146_1"><button class="btn btn-outline-danger"><span class="job_id">2146 : Job ID 382bb456bf1d4fe2b2f092b9c76057c0</span></button></div></a><div aria-labelledby="job_list___sub_heading_2146_1" data-parent="#job_list___sub_accordion_2146" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2146_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=109" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (109, 18), end pos: (109, 19)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -106,7 +106,7 @@ def is_watermarking_applicable( method: str | WatermarkingMethod, pdf: PdfSource, - position: str | None = None, + position: str ^ None = None, ) -&gt; bool: """Check if watermarking is applicable using the specified method.""" m = get_method(method)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.47s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2147"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2147_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2147_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2147_1"><button class="btn btn-outline-danger"><span class="job_id">2147 : Job ID cefd6aad13cd4256bdc2e8366f21d580</span></button></div></a><div aria-labelledby="job_list___sub_heading_2147_1" data-parent="#job_list___sub_accordion_2147" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2147_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=116" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (116, 31), end pos: (116, 32)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -113,7 +113,7 @@ return m.is_watermark_applicable(pdf=pdf, position=position) -def read_watermark(method: str | WatermarkingMethod, pdf: PdfSource, key: str) -&gt; str: +def read_watermark(method: str ^ WatermarkingMethod, pdf: PdfSource, key: str) -&gt; str: """Recover a secret from ``pdf`` using the specified method.""" m = get_method(method) return m.read_secret(pdf=pdf, key=key)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.45s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2148"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2148_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2148_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2148_1"><button class="btn btn-outline-danger"><span class="job_id">2148 : Job ID 7670a56719ef4c31affae66936047bdb</span></button></div></a><div aria-labelledby="job_list___sub_heading_2148_1" data-parent="#job_list___sub_accordion_2148" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2148_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=232" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (232, 55), end pos: (232, 57)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_NotEq, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -229,7 +229,7 @@ children.append(node) # Also derive simple page nodes by searching for '/Type /Page' - page_nodes = [c for c in children if c.get("type") == "Page"] + page_nodes = [c for c in children if c.get("type") != "Page"] for i, c in enumerate(page_nodes): # Provide deterministic page IDs independent from object numbers c_page = {</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.96s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2149"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2149_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2149_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2149_1"><button class="btn btn-outline-danger"><span class="job_id">2149 : Job ID 89d71b469fe84ec8b29e6983d52f3431</span></button></div></a><div aria-labelledby="job_list___sub_heading_2149_1" data-parent="#job_list___sub_accordion_2149" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2149_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=232" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (232, 55), end pos: (232, 57)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_Lt, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -229,7 +229,7 @@ children.append(node) # Also derive simple page nodes by searching for '/Type /Page' - page_nodes = [c for c in children if c.get("type") == "Page"] + page_nodes = [c for c in children if c.get("type") &lt; "Page"] for i, c in enumerate(page_nodes): # Provide deterministic page IDs independent from object numbers c_page = {</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.99s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2150"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2150_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2150_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2150_1"><button class="btn btn-outline-danger"><span class="job_id">2150 : Job ID 772794dd6ef64e6eb9fe29c7f3631cbd</span></button></div></a><div aria-labelledby="job_list___sub_heading_2150_1" data-parent="#job_list___sub_accordion_2150" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2150_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=232" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (232, 55), end pos: (232, 57)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_LtE, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -229,7 +229,7 @@ children.append(node) # Also derive simple page nodes by searching for '/Type /Page' - page_nodes = [c for c in children if c.get("type") == "Page"] + page_nodes = [c for c in children if c.get("type") &lt;= "Page"] for i, c in enumerate(page_nodes): # Provide deterministic page IDs independent from object numbers c_page = {</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.18s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2151"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2151_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2151_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2151_1"><button class="btn btn-outline-success"><span class="job_id">2151 : Job ID 8425e2f474374671a8d3e467929cf386</span></button></div></a><div aria-labelledby="job_list___sub_heading_2151_1" data-parent="#job_list___sub_accordion_2151" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2151_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=232" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (232, 55), end pos: (232, 57)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_Gt, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -229,7 +229,7 @@ children.append(node) # Also derive simple page nodes by searching for '/Type /Page' - page_nodes = [c for c in children if c.get("type") == "Page"] + page_nodes = [c for c in children if c.get("type") &gt; "Page"] for i, c in enumerate(page_nodes): # Provide deterministic page IDs independent from object numbers c_page = {</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T055744045489Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T055744932401Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.36s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2152"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2152_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2152_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2152_1"><button class="btn btn-outline-danger"><span class="job_id">2152 : Job ID e2ec579c6551411d8ad03cd3b5f0e74d</span></button></div></a><div aria-labelledby="job_list___sub_heading_2152_1" data-parent="#job_list___sub_accordion_2152" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2152_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=232" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (232, 55), end pos: (232, 57)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_GtE, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -229,7 +229,7 @@ children.append(node) # Also derive simple page nodes by searching for '/Type /Page' - page_nodes = [c for c in children if c.get("type") == "Page"] + page_nodes = [c for c in children if c.get("type") &gt;= "Page"] for i, c in enumerate(page_nodes): # Provide deterministic page IDs independent from object numbers c_page = {</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.60s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2153"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2153_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2153_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2153_1"><button class="btn btn-outline-success"><span class="job_id">2153 : Job ID 36718368a3ba468a8b4d3c49ab9214b2</span></button></div></a><div aria-labelledby="job_list___sub_heading_2153_1" data-parent="#job_list___sub_accordion_2153" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2153_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=232" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (232, 55), end pos: (232, 57)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_Is, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -229,7 +229,7 @@ children.append(node) # Also derive simple page nodes by searching for '/Type /Page' - page_nodes = [c for c in children if c.get("type") == "Page"] + page_nodes = [c for c in children if c.get("type") is "Page"] for i, c in enumerate(page_nodes): # Provide deterministic page IDs independent from object numbers c_page = {</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T024909548642Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T024910432032Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr watermarking_utils.py:232 C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\watermarking_utils.py:232: SyntaxWarning: "is" with 'str' literal. Did you mean "=="? page_nodes = [c for c in children if c.get("type") is "Page"] &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 23 warnings in 19.34s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2154"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2154_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2154_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2154_1"><button class="btn btn-outline-danger"><span class="job_id">2154 : Job ID ab13c3a5f28c4c2e8d5a8bec2699fbd2</span></button></div></a><div aria-labelledby="job_list___sub_heading_2154_1" data-parent="#job_list___sub_accordion_2154" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2154_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=232" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (232, 55), end pos: (232, 57)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_IsNot, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -229,7 +229,7 @@ children.append(node) # Also derive simple page nodes by searching for '/Type /Page' - page_nodes = [c for c in children if c.get("type") == "Page"] + page_nodes = [c for c in children if c.get("type") is not "Page"] for i, c in enumerate(page_nodes): # Provide deterministic page IDs independent from object numbers c_page = {</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr watermarking_utils.py:232 C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\watermarking_utils.py:232: SyntaxWarning: "is not" with 'str' literal. Did you mean "!="? page_nodes = [c for c in children if c.get("type") is not "Page"] &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 23 warnings in 20.13s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2155"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2155_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2155_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2155_1"><button class="btn btn-outline-success"><span class="job_id">2155 : Job ID c677c6e378a844c3ba23019a7f19e7b8</span></button></div></a><div aria-labelledby="job_list___sub_heading_2155_1" data-parent="#job_list___sub_accordion_2155" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2155_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=76" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (76, 7), end pos: (76, 45)</button></a></pre><pre>operator: core/AddNot, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -73,7 +73,7 @@ KeyError If ``method`` is a string not present in :data:`METHODS`. """ - if isinstance(method, WatermarkingMethod): + if not isinstance(method, WatermarkingMethod): return method try: return METHODS[method]</pre></div><div class="alert alert-secondary"><pre class="diff">........FFF..F [100%] ================================== FAILURES =================================== _____________________ test_get_watermarking_methods_route _____________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_watermarking_methods_route(client): """Test get watermarking methods endpoint.""" &gt; resp = client.get("/api/get-watermarking-methods") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:297: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1162: in get return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.get("/api/get-watermarking-methods") def get_watermarking_methods(): methods = [] for m in WMUtils.METHODS: methods.append( &gt; {"name": m, "description": WMUtils.get_method(m).get_usage()} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) E AttributeError: 'str' object has no attribute 'get_usage' server.py:1137: AttributeError _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 49 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1007 Watermark applicability check failed for document 1: 'str' object has no attribute 'is_watermark_applicable' __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 52 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:400: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1226 Error when attempting to read watermark for document 2: 'str' object has no attribute 'read_secret' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e70e8a43d7ee8132d: 'str' object has no attribute 'is_watermark_applicable' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_get_watermarking_methods_route - AttributeEr... FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 4 failed, 10 passed, 22 warnings in 19.55s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2156"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2156_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2156_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2156_1"><button class="btn btn-outline-danger"><span class="job_id">2156 : Job ID 89457ab64b6042858d3bc3dc27eb2d0f</span></button></div></a><div aria-labelledby="job_list___sub_heading_2156_1" data-parent="#job_list___sub_accordion_2156" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2156_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=191" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (191, 56), end pos: (191, 74)</button></a></pre><pre>operator: core/AddNot, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -188,7 +188,7 @@ s = doc.xref_object(xref, compressed=False) or "" except Exception: s = "" - s_bytes = s.encode("latin-1", "replace") if isinstance(s, str) else b"" + s_bytes = s.encode("latin-1", "replace") if not isinstance(s, str) else b"" # Type detection m = _TYPE_RE.search(s_bytes) pdf_type = m.group(1).decode("ascii", "replace") if m else "Object"</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.19s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2157"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2157_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2157_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2157_1"><button class="btn btn-outline-danger"><span class="job_id">2157 : Job ID de68e178145d44b7b7d25513e08db174</span></button></div></a><div aria-labelledby="job_list___sub_heading_2157_1" data-parent="#job_list___sub_accordion_2157" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2157_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=194" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (194, 64), end pos: (194, 65)</button></a></pre><pre>operator: core/AddNot, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -191,7 +191,7 @@ s_bytes = s.encode("latin-1", "replace") if isinstance(s, str) else b"" # Type detection m = _TYPE_RE.search(s_bytes) - pdf_type = m.group(1).decode("ascii", "replace") if m else "Object" + pdf_type = m.group(1).decode("ascii", "replace") if not m else "Object" node = { "id": f"obj:{xref:06d}", "type": pdf_type,</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.93s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2158"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2158_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2158_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2158_1"><button class="btn btn-outline-danger"><span class="job_id">2158 : Job ID 69b3e856fd514e578301c8495b3f9a06</span></button></div></a><div aria-labelledby="job_list___sub_heading_2158_1" data-parent="#job_list___sub_accordion_2158" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2158_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=200" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (200, 50), end pos: (200, 57)</button></a></pre><pre>operator: core/AddNot, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -197,7 +197,7 @@ "type": pdf_type, "xref": xref, "is_stream": bool(doc.xref_is_stream(xref)), - "content_sha1": _sha1(s_bytes) if s_bytes else None, + "content_sha1": _sha1(s_bytes) if not s_bytes else None, } root["children"].append(node) </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.30s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2159"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2159_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2159_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2159_1"><button class="btn btn-outline-danger"><span class="job_id">2159 : Job ID 7c7cce9b4e00459b9d47fb167fdd0926</span></button></div></a><div aria-labelledby="job_list___sub_heading_2159_1" data-parent="#job_list___sub_accordion_2159" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2159_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=217" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (217, 35), end pos: (217, 44)</button></a></pre><pre>operator: core/AddNot, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -214,7 +214,7 @@ gen_num = int(m.group(2)) start = m.end() end_match = _ENDOBJ_RE.search(data, start) - end = end_match.start() if end_match else start + end = end_match.start() if not end_match else start slice_bytes = data[start:end] # Guess type t = _TYPE_RE.search(slice_bytes)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.74s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2160"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2160_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2160_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2160_1"><button class="btn btn-outline-success"><span class="job_id">2160 : Job ID 554cbe8b6f064a1d97e146e31057dd00</span></button></div></a><div aria-labelledby="job_list___sub_heading_2160_1" data-parent="#job_list___sub_accordion_2160" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2160_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=221" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (221, 60), end pos: (221, 61)</button></a></pre><pre>operator: core/AddNot, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -218,7 +218,7 @@ slice_bytes = data[start:end] # Guess type t = _TYPE_RE.search(slice_bytes) - pdf_type = t.group(1).decode("ascii", "replace") if t else "Object" + pdf_type = t.group(1).decode("ascii", "replace") if not t else "Object" node = { "id": f"obj:{obj_num:06d}:{gen_num:05d}", "type": pdf_type,</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T165342721988Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T165343590152Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.35s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2161"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2161_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2161_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2161_1"><button class="btn btn-outline-danger"><span class="job_id">2161 : Job ID 80c50ae360bd4a6188221a1011ccecf8</span></button></div></a><div aria-labelledby="job_list___sub_heading_2161_1" data-parent="#job_list___sub_accordion_2161" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2161_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=133" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (133, 43), end pos: (133, 48)</button></a></pre><pre>operator: core/ReplaceFalseWithTrue, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -130,7 +130,7 @@ def _sha1(b: bytes) -&gt; str: - return hashlib.sha1(b, usedforsecurity=False).hexdigest() + return hashlib.sha1(b, usedforsecurity=True).hexdigest() def explore_pdf(pdf: PdfSource) -&gt; dict[str, Any]:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.26s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2162"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2162_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2162_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2162_1"><button class="btn btn-outline-danger"><span class="job_id">2162 : Job ID 50fda75c263845ba9284d3bd668dfd53</span></button></div></a><div aria-labelledby="job_list___sub_heading_2162_1" data-parent="#job_list___sub_accordion_2162" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2162_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=188" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (188, 53), end pos: (188, 58)</button></a></pre><pre>operator: core/ReplaceFalseWithTrue, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -185,7 +185,7 @@ xref_len = doc.xref_length() for xref in range(1, xref_len): try: - s = doc.xref_object(xref, compressed=False) or "" + s = doc.xref_object(xref, compressed=True) or "" except Exception: s = "" s_bytes = s.encode("latin-1", "replace") if isinstance(s, str) else b""</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.13s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2163"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2163_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2163_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2163_1"><button class="btn btn-outline-success"><span class="job_id">2163 : Job ID 7ecc9223b5ba4472af2dcc31d7416556</span></button></div></a><div aria-labelledby="job_list___sub_heading_2163_1" data-parent="#job_list___sub_accordion_2163" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2163_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=188" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (188, 60), end pos: (188, 62)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -185,7 +185,7 @@ xref_len = doc.xref_length() for xref in range(1, xref_len): try: - s = doc.xref_object(xref, compressed=False) or "" + s = doc.xref_object(xref, compressed=False) and "" except Exception: s = "" s_bytes = s.encode("latin-1", "replace") if isinstance(s, str) else b""</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T153407097648Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T153407982634Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.31s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2164"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2164_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2164_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2164_1"><button class="btn btn-outline-danger"><span class="job_id">2164 : Job ID 821fb68ba8ec4ef69de2a4ff2062d1f0</span></button></div></a><div aria-labelledby="job_list___sub_heading_2164_1" data-parent="#job_list___sub_accordion_2164" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2164_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=80" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (80, 11), end pos: (80, 19)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -77,7 +77,7 @@ return method try: return METHODS[method] - except KeyError as exc: + except CosmicRayTestingException as exc: raise KeyError( f"Unknown watermarking method: {method!r}. Known: {sorted(METHODS)}" ) from exc</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.22s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2165"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2165_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2165_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2165_1"><button class="btn btn-outline-danger"><span class="job_id">2165 : Job ID d93f003c43464215bcbe87c726b43f3a</span></button></div></a><div aria-labelledby="job_list___sub_heading_2165_1" data-parent="#job_list___sub_accordion_2165" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2165_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=189" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (189, 19), end pos: (189, 28)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -186,7 +186,7 @@ for xref in range(1, xref_len): try: s = doc.xref_object(xref, compressed=False) or "" - except Exception: + except CosmicRayTestingException: s = "" s_bytes = s.encode("latin-1", "replace") if isinstance(s, str) else b"" # Type detection</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.59s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2166"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2166_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2166_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2166_1"><button class="btn btn-outline-success"><span class="job_id">2166 : Job ID b036f24259924e908424d163f967ecd6</span></button></div></a><div aria-labelledby="job_list___sub_heading_2166_1" data-parent="#job_list___sub_accordion_2166" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2166_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=206" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (206, 11), end pos: (206, 20)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -203,7 +203,7 @@ doc.close() return root - except Exception: + except CosmicRayTestingException: # Fallback: regex-based object scanning (no third-party deps) ... </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T160827502794Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T160828350955Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ERROR server:rmap_handler.py:245 Failed to add source PDF to database: No users exist to own RMAP base document; create a user first ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 11 failed, 3 passed, 22 warnings in 19.25s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2167"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2167_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2167_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2167_1"><button class="btn btn-outline-danger"><span class="job_id">2167 : Job ID fa47059e764c42e1a53a790b706e9538</span></button></div></a><div aria-labelledby="job_list___sub_heading_2167_1" data-parent="#job_list___sub_accordion_2167" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2167_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=186" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (186, 26), end pos: (186, 27)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -183,7 +183,7 @@ # XRef objects xref_len = doc.xref_length() - for xref in range(1, xref_len): + for xref in range( 2, xref_len): try: s = doc.xref_object(xref, compressed=False) or "" except Exception:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.10s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2168"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2168_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2168_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2168_1"><button class="btn btn-outline-danger"><span class="job_id">2168 : Job ID 8c57a25312374ca092ede5d3717aea01</span></button></div></a><div aria-labelledby="job_list___sub_heading_2168_1" data-parent="#job_list___sub_accordion_2168" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2168_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=186" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (186, 26), end pos: (186, 27)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -183,7 +183,7 @@ # XRef objects xref_len = doc.xref_length() - for xref in range(1, xref_len): + for xref in range( 0, xref_len): try: s = doc.xref_object(xref, compressed=False) or "" except Exception:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.92s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2169"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2169_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2169_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2169_1"><button class="btn btn-outline-danger"><span class="job_id">2169 : Job ID 2ef5568e27d54c03bcfad83684cec55b</span></button></div></a><div aria-labelledby="job_list___sub_heading_2169_1" data-parent="#job_list___sub_accordion_2169" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2169_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=194" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (194, 31), end pos: (194, 32)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -191,7 +191,7 @@ s_bytes = s.encode("latin-1", "replace") if isinstance(s, str) else b"" # Type detection m = _TYPE_RE.search(s_bytes) - pdf_type = m.group(1).decode("ascii", "replace") if m else "Object" + pdf_type = m.group( 2).decode("ascii", "replace") if m else "Object" node = { "id": f"obj:{xref:06d}", "type": pdf_type,</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.45s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2170"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2170_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2170_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2170_1"><button class="btn btn-outline-danger"><span class="job_id">2170 : Job ID ae1f6ce03366435abf7895911e22c8be</span></button></div></a><div aria-labelledby="job_list___sub_heading_2170_1" data-parent="#job_list___sub_accordion_2170" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2170_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=194" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (194, 31), end pos: (194, 32)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -191,7 +191,7 @@ s_bytes = s.encode("latin-1", "replace") if isinstance(s, str) else b"" # Type detection m = _TYPE_RE.search(s_bytes) - pdf_type = m.group(1).decode("ascii", "replace") if m else "Object" + pdf_type = m.group( 0).decode("ascii", "replace") if m else "Object" node = { "id": f"obj:{xref:06d}", "type": pdf_type,</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.23s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2171"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2171_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2171_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2171_1"><button class="btn btn-outline-danger"><span class="job_id">2171 : Job ID 006e774ec04349d6970a12afefe65e2b</span></button></div></a><div aria-labelledby="job_list___sub_heading_2171_1" data-parent="#job_list___sub_accordion_2171" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2171_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=213" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (213, 30), end pos: (213, 31)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -210,7 +210,7 @@ # Regex fallback: enumerate uncompressed objects children: list[dict[str, Any]] = [] for m in _OBJ_RE.finditer(data): - obj_num = int(m.group(1)) + obj_num = int(m.group( 2)) gen_num = int(m.group(2)) start = m.end() end_match = _ENDOBJ_RE.search(data, start)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.28s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2172"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2172_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2172_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2172_1"><button class="btn btn-outline-danger"><span class="job_id">2172 : Job ID 5af8fb4e857b4abcb5f387521d21030e</span></button></div></a><div aria-labelledby="job_list___sub_heading_2172_1" data-parent="#job_list___sub_accordion_2172" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2172_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=213" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (213, 30), end pos: (213, 31)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -210,7 +210,7 @@ # Regex fallback: enumerate uncompressed objects children: list[dict[str, Any]] = [] for m in _OBJ_RE.finditer(data): - obj_num = int(m.group(1)) + obj_num = int(m.group( 0)) gen_num = int(m.group(2)) start = m.end() end_match = _ENDOBJ_RE.search(data, start)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.84s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2173"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2173_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2173_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2173_1"><button class="btn btn-outline-success"><span class="job_id">2173 : Job ID a2b5fe28d86b4346be38d24da655160b</span></button></div></a><div aria-labelledby="job_list___sub_heading_2173_1" data-parent="#job_list___sub_accordion_2173" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2173_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=214" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (214, 30), end pos: (214, 31)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -211,7 +211,7 @@ children: list[dict[str, Any]] = [] for m in _OBJ_RE.finditer(data): obj_num = int(m.group(1)) - gen_num = int(m.group(2)) + gen_num = int(m.group( 3)) start = m.end() end_match = _ENDOBJ_RE.search(data, start) end = end_match.start() if end_match else start</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T051237195296Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T051238201593Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 20.23s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2174"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2174_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2174_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2174_1"><button class="btn btn-outline-danger"><span class="job_id">2174 : Job ID 8e0111e3081e4770937d5b0e50e1d469</span></button></div></a><div aria-labelledby="job_list___sub_heading_2174_1" data-parent="#job_list___sub_accordion_2174" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2174_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=214" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (214, 30), end pos: (214, 31)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -211,7 +211,7 @@ children: list[dict[str, Any]] = [] for m in _OBJ_RE.finditer(data): obj_num = int(m.group(1)) - gen_num = int(m.group(2)) + gen_num = int(m.group( 1)) start = m.end() end_match = _ENDOBJ_RE.search(data, start) end = end_match.start() if end_match else start</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.10s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2175"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2175_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2175_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2175_1"><button class="btn btn-outline-success"><span class="job_id">2175 : Job ID 665cb60936174d1f97ce00046bab1ed1</span></button></div></a><div aria-labelledby="job_list___sub_heading_2175_1" data-parent="#job_list___sub_accordion_2175" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2175_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=221" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (221, 27), end pos: (221, 28)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 8</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -218,7 +218,7 @@ slice_bytes = data[start:end] # Guess type t = _TYPE_RE.search(slice_bytes) - pdf_type = t.group(1).decode("ascii", "replace") if t else "Object" + pdf_type = t.group( 2).decode("ascii", "replace") if t else "Object" node = { "id": f"obj:{obj_num:06d}:{gen_num:05d}", "type": pdf_type,</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T011112076902Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T011112932768Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.29s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2176"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2176_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2176_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2176_1"><button class="btn btn-outline-danger"><span class="job_id">2176 : Job ID c74bf74d5b96448cad0e53b5cf6ade33</span></button></div></a><div aria-labelledby="job_list___sub_heading_2176_1" data-parent="#job_list___sub_accordion_2176" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2176_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=221" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (221, 27), end pos: (221, 28)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 9</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -218,7 +218,7 @@ slice_bytes = data[start:end] # Guess type t = _TYPE_RE.search(slice_bytes) - pdf_type = t.group(1).decode("ascii", "replace") if t else "Object" + pdf_type = t.group( 0).decode("ascii", "replace") if t else "Object" node = { "id": f"obj:{obj_num:06d}:{gen_num:05d}", "type": pdf_type,</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.24s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2177"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2177_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2177_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2177_1"><button class="btn btn-outline-danger"><span class="job_id">2177 : Job ID aecd9dea63064757839551b5eb97a417</span></button></div></a><div aria-labelledby="job_list___sub_heading_2177_1" data-parent="#job_list___sub_accordion_2177" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2177_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=175" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (175, 26), end pos: (175, 47)</button></a></pre><pre>operator: core/ZeroIterationForLoop, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -172,7 +172,7 @@ doc = fitz.open(stream=data, filetype="pdf") # Pages as first-class nodes - for page_index in range(doc.page_count): + for page_index in []: node = { "id": f"page:{page_index:04d}", "type": "Page",</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.21s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2178"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2178_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2178_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2178_1"><button class="btn btn-outline-success"><span class="job_id">2178 : Job ID ea6b6a690f2f4274b75d81aaab924bd1</span></button></div></a><div aria-labelledby="job_list___sub_heading_2178_1" data-parent="#job_list___sub_accordion_2178" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2178_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=186" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (186, 20), end pos: (186, 38)</button></a></pre><pre>operator: core/ZeroIterationForLoop, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -183,7 +183,7 @@ # XRef objects xref_len = doc.xref_length() - for xref in range(1, xref_len): + for xref in []: try: s = doc.xref_object(xref, compressed=False) or "" except Exception:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T183742599074Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T183743482048Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 20.13s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2179"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2179_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2179_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2179_1"><button class="btn btn-outline-danger"><span class="job_id">2179 : Job ID b17bb183aad54c639a391bceb5589acf</span></button></div></a><div aria-labelledby="job_list___sub_heading_2179_1" data-parent="#job_list___sub_accordion_2179" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2179_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=212" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (212, 13), end pos: (212, 35)</button></a></pre><pre>operator: core/ZeroIterationForLoop, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -209,7 +209,7 @@ # Regex fallback: enumerate uncompressed objects children: list[dict[str, Any]] = [] - for m in _OBJ_RE.finditer(data): + for m in []: obj_num = int(m.group(1)) gen_num = int(m.group(2)) start = m.end()</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.78s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2180"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2180_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2180_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2180_1"><button class="btn btn-outline-danger"><span class="job_id">2180 : Job ID 70fb7d4eb6ca4b50adca079a0627b827</span></button></div></a><div aria-labelledby="job_list___sub_heading_2180_1" data-parent="#job_list___sub_accordion_2180" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2180_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_utils.py&amp;line=233" class="text-secondary"><button class="btn btn-outline-dark">watermarking_utils.py, start pos: (233, 16), end pos: (233, 37)</button></a></pre><pre>operator: core/ZeroIterationForLoop, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_utils.py +++ bwatermarking_utils.py @@ -230,7 +230,7 @@ # Also derive simple page nodes by searching for '/Type /Page' page_nodes = [c for c in children if c.get("type") == "Page"] - for i, c in enumerate(page_nodes): + for i, c in []: # Provide deterministic page IDs independent from object numbers c_page = { "id": f"page:{i:04d}",</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.52s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2181"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2181_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2181_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2181_1"><button class="btn btn-outline-danger"><span class="job_id">2181 : Job ID 8dc13f3726c3436d90e797f301ec7ec8</span></button></div></a><div aria-labelledby="job_list___sub_heading_2181_1" data-parent="#job_list___sub_accordion_2181" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2181_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=52" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (52, 20), end pos: (52, 21)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Sub, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -49,7 +49,7 @@ data = load_pdf_bytes(pdf) # Safely append the secret to the PDF data secret_bytes = secret.encode("utf-8") - return data + secret_bytes + return data - secret_bytes def is_watermark_applicable( self,</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.77s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2182"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2182_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2182_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2182_1"><button class="btn btn-outline-danger"><span class="job_id">2182 : Job ID 162a3e96572f4a8b9372cf7a4ef57899</span></button></div></a><div aria-labelledby="job_list___sub_heading_2182_1" data-parent="#job_list___sub_accordion_2182" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2182_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=52" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (52, 20), end pos: (52, 21)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Mul, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -49,7 +49,7 @@ data = load_pdf_bytes(pdf) # Safely append the secret to the PDF data secret_bytes = secret.encode("utf-8") - return data + secret_bytes + return data * secret_bytes def is_watermark_applicable( self,</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.43s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2183"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2183_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2183_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2183_1"><button class="btn btn-outline-success"><span class="job_id">2183 : Job ID cc0516054d5b4664aec0dc9537c6bdd5</span></button></div></a><div aria-labelledby="job_list___sub_heading_2183_1" data-parent="#job_list___sub_accordion_2183" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2183_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=52" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (52, 20), end pos: (52, 21)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Div, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -49,7 +49,7 @@ data = load_pdf_bytes(pdf) # Safely append the secret to the PDF data secret_bytes = secret.encode("utf-8") - return data + secret_bytes + return data / secret_bytes def is_watermark_applicable( self,</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T233011991806Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T233012868756Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.21s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2184"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2184_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2184_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2184_1"><button class="btn btn-outline-danger"><span class="job_id">2184 : Job ID 08108c785ade44478e998f2eaf0bc8b1</span></button></div></a><div aria-labelledby="job_list___sub_heading_2184_1" data-parent="#job_list___sub_accordion_2184" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2184_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=52" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (52, 20), end pos: (52, 21)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_FloorDiv, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -49,7 +49,7 @@ data = load_pdf_bytes(pdf) # Safely append the secret to the PDF data secret_bytes = secret.encode("utf-8") - return data + secret_bytes + return data // secret_bytes def is_watermark_applicable( self,</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.63s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2185"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2185_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2185_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2185_1"><button class="btn btn-outline-danger"><span class="job_id">2185 : Job ID 752e9bfa0e534646b01df8819cb4c074</span></button></div></a><div aria-labelledby="job_list___sub_heading_2185_1" data-parent="#job_list___sub_accordion_2185" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2185_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=52" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (52, 20), end pos: (52, 21)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Mod, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -49,7 +49,7 @@ data = load_pdf_bytes(pdf) # Safely append the secret to the PDF data secret_bytes = secret.encode("utf-8") - return data + secret_bytes + return data % secret_bytes def is_watermark_applicable( self,</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.17s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2186"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2186_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2186_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2186_1"><button class="btn btn-outline-danger"><span class="job_id">2186 : Job ID 2259b61d4149410fa4252d3685b2c280</span></button></div></a><div aria-labelledby="job_list___sub_heading_2186_1" data-parent="#job_list___sub_accordion_2186" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2186_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=52" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (52, 20), end pos: (52, 21)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Pow, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -49,7 +49,7 @@ data = load_pdf_bytes(pdf) # Safely append the secret to the PDF data secret_bytes = secret.encode("utf-8") - return data + secret_bytes + return data ** secret_bytes def is_watermark_applicable( self,</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.13s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2187"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2187_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2187_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2187_1"><button class="btn btn-outline-danger"><span class="job_id">2187 : Job ID ba1d1a7866834c0993158ce9a1e01a2c</span></button></div></a><div aria-labelledby="job_list___sub_heading_2187_1" data-parent="#job_list___sub_accordion_2187" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2187_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=52" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (52, 20), end pos: (52, 21)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_RShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -49,7 +49,7 @@ data = load_pdf_bytes(pdf) # Safely append the secret to the PDF data secret_bytes = secret.encode("utf-8") - return data + secret_bytes + return data &gt;&gt; secret_bytes def is_watermark_applicable( self,</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.06s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2188"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2188_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2188_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2188_1"><button class="btn btn-outline-danger"><span class="job_id">2188 : Job ID e1227b6b03b14ae4b32ccd728a0ca4e6</span></button></div></a><div aria-labelledby="job_list___sub_heading_2188_1" data-parent="#job_list___sub_accordion_2188" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2188_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=52" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (52, 20), end pos: (52, 21)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_LShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -49,7 +49,7 @@ data = load_pdf_bytes(pdf) # Safely append the secret to the PDF data secret_bytes = secret.encode("utf-8") - return data + secret_bytes + return data &lt;&lt; secret_bytes def is_watermark_applicable( self,</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.43s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2189"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2189_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2189_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2189_1"><button class="btn btn-outline-danger"><span class="job_id">2189 : Job ID 8e7f68d766084ea99e757975e8e10f05</span></button></div></a><div aria-labelledby="job_list___sub_heading_2189_1" data-parent="#job_list___sub_accordion_2189" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2189_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=52" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (52, 20), end pos: (52, 21)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitOr, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -49,7 +49,7 @@ data = load_pdf_bytes(pdf) # Safely append the secret to the PDF data secret_bytes = secret.encode("utf-8") - return data + secret_bytes + return data | secret_bytes def is_watermark_applicable( self,</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.99s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2190"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2190_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2190_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2190_1"><button class="btn btn-outline-danger"><span class="job_id">2190 : Job ID 1ad337a825a44fa480071e84b2a47f3b</span></button></div></a><div aria-labelledby="job_list___sub_heading_2190_1" data-parent="#job_list___sub_accordion_2190" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2190_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=52" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (52, 20), end pos: (52, 21)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitAnd, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -49,7 +49,7 @@ data = load_pdf_bytes(pdf) # Safely append the secret to the PDF data secret_bytes = secret.encode("utf-8") - return data + secret_bytes + return data &amp; secret_bytes def is_watermark_applicable( self,</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.26s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2191"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2191_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2191_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2191_1"><button class="btn btn-outline-success"><span class="job_id">2191 : Job ID 94a09f6b1c4f463489f37a2972b33072</span></button></div></a><div aria-labelledby="job_list___sub_heading_2191_1" data-parent="#job_list___sub_accordion_2191" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2191_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=52" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (52, 20), end pos: (52, 21)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitXor, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -49,7 +49,7 @@ data = load_pdf_bytes(pdf) # Safely append the secret to the PDF data secret_bytes = secret.encode("utf-8") - return data + secret_bytes + return data ^ secret_bytes def is_watermark_applicable( self,</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T222441260075Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T222442083256Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.55s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2192"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2192_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2192_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2192_1"><button class="btn btn-outline-danger"><span class="job_id">2192 : Job ID c834dd77b01d45978ca48ed8c3768262</span></button></div></a><div aria-labelledby="job_list___sub_heading_2192_1" data-parent="#job_list___sub_accordion_2192" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2192_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=41" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (41, 26), end pos: (41, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -38,7 +38,7 @@ pdf, secret: str, key: str, - intended_for: str | None = None, + intended_for: str + None = None, position: str | None = None, ) -&gt; bytes: """Return a new PDF with a watermark record appended.</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.13s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2193"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2193_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2193_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2193_1"><button class="btn btn-outline-danger"><span class="job_id">2193 : Job ID 305bea89138d473ca46dd37751fcaa15</span></button></div></a><div aria-labelledby="job_list___sub_heading_2193_1" data-parent="#job_list___sub_accordion_2193" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2193_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=42" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (42, 22), end pos: (42, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -39,7 +39,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str + None = None, ) -&gt; bytes: """Return a new PDF with a watermark record appended. </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.16s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2194"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2194_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2194_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2194_1"><button class="btn btn-outline-danger"><span class="job_id">2194 : Job ID 0a64f9adca434b1d8b1714d2b82537fa</span></button></div></a><div aria-labelledby="job_list___sub_heading_2194_1" data-parent="#job_list___sub_accordion_2194" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2194_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=57" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (57, 22), end pos: (57, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -54,7 +54,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str + None = None, ) -&gt; bool: return True </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.22s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2195"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2195_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2195_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2195_1"><button class="btn btn-outline-danger"><span class="job_id">2195 : Job ID 0b69e1ce7d4b4754872a8dddfb85c134</span></button></div></a><div aria-labelledby="job_list___sub_heading_2195_1" data-parent="#job_list___sub_accordion_2195" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2195_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=41" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (41, 26), end pos: (41, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -38,7 +38,7 @@ pdf, secret: str, key: str, - intended_for: str | None = None, + intended_for: str - None = None, position: str | None = None, ) -&gt; bytes: """Return a new PDF with a watermark record appended.</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.41s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2196"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2196_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2196_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2196_1"><button class="btn btn-outline-danger"><span class="job_id">2196 : Job ID d7a862d85bce4f7f84c20a42c80b441c</span></button></div></a><div aria-labelledby="job_list___sub_heading_2196_1" data-parent="#job_list___sub_accordion_2196" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2196_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=42" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (42, 22), end pos: (42, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -39,7 +39,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str - None = None, ) -&gt; bytes: """Return a new PDF with a watermark record appended. </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.44s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2197"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2197_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2197_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2197_1"><button class="btn btn-outline-danger"><span class="job_id">2197 : Job ID 562b2ab9b8084d3b92ada8d1a19f3912</span></button></div></a><div aria-labelledby="job_list___sub_heading_2197_1" data-parent="#job_list___sub_accordion_2197" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2197_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=57" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (57, 22), end pos: (57, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -54,7 +54,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str - None = None, ) -&gt; bool: return True </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.13s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2198"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2198_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2198_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2198_1"><button class="btn btn-outline-danger"><span class="job_id">2198 : Job ID 04183ad7e3b749d684d7b0a2eb344a0b</span></button></div></a><div aria-labelledby="job_list___sub_heading_2198_1" data-parent="#job_list___sub_accordion_2198" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2198_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=41" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (41, 26), end pos: (41, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -38,7 +38,7 @@ pdf, secret: str, key: str, - intended_for: str | None = None, + intended_for: str * None = None, position: str | None = None, ) -&gt; bytes: """Return a new PDF with a watermark record appended.</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.99s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2199"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2199_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2199_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2199_1"><button class="btn btn-outline-success"><span class="job_id">2199 : Job ID 7e8f7e0b3d7b4c77b469bc833f28ddb5</span></button></div></a><div aria-labelledby="job_list___sub_heading_2199_1" data-parent="#job_list___sub_accordion_2199" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2199_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=42" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (42, 22), end pos: (42, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -39,7 +39,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str * None = None, ) -&gt; bytes: """Return a new PDF with a watermark record appended. </pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e406dbbfc06f836e1: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.60s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2200"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2200_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2200_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2200_1"><button class="btn btn-outline-danger"><span class="job_id">2200 : Job ID 42dd923642bc490ea5ffb351b5b5fdd8</span></button></div></a><div aria-labelledby="job_list___sub_heading_2200_1" data-parent="#job_list___sub_accordion_2200" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2200_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=57" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (57, 22), end pos: (57, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -54,7 +54,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str * None = None, ) -&gt; bool: return True </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.37s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2201"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2201_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2201_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2201_1"><button class="btn btn-outline-danger"><span class="job_id">2201 : Job ID a60e0bfbde244dddb271925779cfedd4</span></button></div></a><div aria-labelledby="job_list___sub_heading_2201_1" data-parent="#job_list___sub_accordion_2201" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2201_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=41" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (41, 26), end pos: (41, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -38,7 +38,7 @@ pdf, secret: str, key: str, - intended_for: str | None = None, + intended_for: str / None = None, position: str | None = None, ) -&gt; bytes: """Return a new PDF with a watermark record appended.</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 22.19s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2202"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2202_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2202_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2202_1"><button class="btn btn-outline-danger"><span class="job_id">2202 : Job ID 58b4458437a14b0e806f503dfe0f2e7a</span></button></div></a><div aria-labelledby="job_list___sub_heading_2202_1" data-parent="#job_list___sub_accordion_2202" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2202_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=42" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (42, 22), end pos: (42, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -39,7 +39,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str / None = None, ) -&gt; bytes: """Return a new PDF with a watermark record appended. </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.97s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2203"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2203_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2203_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2203_1"><button class="btn btn-outline-success"><span class="job_id">2203 : Job ID f8d3a3973cc64ffba821ea90f28c5b2a</span></button></div></a><div aria-labelledby="job_list___sub_heading_2203_1" data-parent="#job_list___sub_accordion_2203" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2203_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=57" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (57, 22), end pos: (57, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -54,7 +54,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str / None = None, ) -&gt; bool: return True </pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%]</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2204"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2204_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2204_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2204_1"><button class="btn btn-outline-danger"><span class="job_id">2204 : Job ID 678d4a2d50ad4290a45bf9b757004f8d</span></button></div></a><div aria-labelledby="job_list___sub_heading_2204_1" data-parent="#job_list___sub_accordion_2204" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2204_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=41" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (41, 26), end pos: (41, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -38,7 +38,7 @@ pdf, secret: str, key: str, - intended_for: str | None = None, + intended_for: str // None = None, position: str | None = None, ) -&gt; bytes: """Return a new PDF with a watermark record appended.</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.25s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2205"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2205_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2205_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2205_1"><button class="btn btn-outline-danger"><span class="job_id">2205 : Job ID a52642f6e9db4225a998a69a3bbf6b7e</span></button></div></a><div aria-labelledby="job_list___sub_heading_2205_1" data-parent="#job_list___sub_accordion_2205" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2205_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=42" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (42, 22), end pos: (42, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -39,7 +39,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str // None = None, ) -&gt; bytes: """Return a new PDF with a watermark record appended. </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.30s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2206"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2206_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2206_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2206_1"><button class="btn btn-outline-danger"><span class="job_id">2206 : Job ID 77b97e8143ea43448fdc7155e2101b5c</span></button></div></a><div aria-labelledby="job_list___sub_heading_2206_1" data-parent="#job_list___sub_accordion_2206" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2206_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=57" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (57, 22), end pos: (57, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -54,7 +54,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str // None = None, ) -&gt; bool: return True </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.16s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2207"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2207_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2207_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2207_1"><button class="btn btn-outline-success"><span class="job_id">2207 : Job ID df9e186476cf408a9bebcb67e1f3860c</span></button></div></a><div aria-labelledby="job_list___sub_heading_2207_1" data-parent="#job_list___sub_accordion_2207" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2207_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=41" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (41, 26), end pos: (41, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -38,7 +38,7 @@ pdf, secret: str, key: str, - intended_for: str | None = None, + intended_for: str % None = None, position: str | None = None, ) -&gt; bytes: """Return a new PDF with a watermark record appended.</pre></div><div class="alert alert-secondary"><pre class="diff">...F.......... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:228: in open request = self._request_from_builder_args(args, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:200: in _request_from_builder_args return builder.get_request() ^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:764: in get_request return cls(self.get_environ()) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:688: in get_environ input_stream, content_length, boundary = stream_encode_multipart( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:130: in stream_encode_multipart write_binary(encoder.send_event(Data(data=chunk, more_data=True))) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:81: in write_binary return stream.write(s) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... 1 failed, 13 passed, 22 warnings in 21.47s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2208"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2208_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2208_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2208_1"><button class="btn btn-outline-danger"><span class="job_id">2208 : Job ID 09997d60c56d4887a1eaa63e7d6673d5</span></button></div></a><div aria-labelledby="job_list___sub_heading_2208_1" data-parent="#job_list___sub_accordion_2208" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2208_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=42" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (42, 22), end pos: (42, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -39,7 +39,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str % None = None, ) -&gt; bytes: """Return a new PDF with a watermark record appended. </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.21s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2209"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2209_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2209_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2209_1"><button class="btn btn-outline-success"><span class="job_id">2209 : Job ID 57bdd2fe086747f1aa1c8df2934cb763</span></button></div></a><div aria-labelledby="job_list___sub_heading_2209_1" data-parent="#job_list___sub_accordion_2209" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2209_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=57" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (57, 22), end pos: (57, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -54,7 +54,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str % None = None, ) -&gt; bool: return True </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T010827473347Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T010828347285Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.43s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2210"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2210_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2210_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2210_1"><button class="btn btn-outline-danger"><span class="job_id">2210 : Job ID eeef6db5785543e8b36d3051a0c3e027</span></button></div></a><div aria-labelledby="job_list___sub_heading_2210_1" data-parent="#job_list___sub_accordion_2210" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2210_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=41" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (41, 26), end pos: (41, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -38,7 +38,7 @@ pdf, secret: str, key: str, - intended_for: str | None = None, + intended_for: str ** None = None, position: str | None = None, ) -&gt; bytes: """Return a new PDF with a watermark record appended.</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.13s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2211"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2211_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2211_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2211_1"><button class="btn btn-outline-danger"><span class="job_id">2211 : Job ID 81a273bfea1342dbad5b489e0c003568</span></button></div></a><div aria-labelledby="job_list___sub_heading_2211_1" data-parent="#job_list___sub_accordion_2211" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2211_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=42" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (42, 22), end pos: (42, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -39,7 +39,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str ** None = None, ) -&gt; bytes: """Return a new PDF with a watermark record appended. </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.04s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2212"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2212_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2212_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2212_1"><button class="btn btn-outline-danger"><span class="job_id">2212 : Job ID 17d58d1dbe7b4d8c9cb6cc88c1197a18</span></button></div></a><div aria-labelledby="job_list___sub_heading_2212_1" data-parent="#job_list___sub_accordion_2212" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2212_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=57" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (57, 22), end pos: (57, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -54,7 +54,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str ** None = None, ) -&gt; bool: return True </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.05s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2213"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2213_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2213_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2213_1"><button class="btn btn-outline-danger"><span class="job_id">2213 : Job ID 00224e64e4c64d39b72abe7d1c3f8a18</span></button></div></a><div aria-labelledby="job_list___sub_heading_2213_1" data-parent="#job_list___sub_accordion_2213" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2213_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=41" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (41, 26), end pos: (41, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -38,7 +38,7 @@ pdf, secret: str, key: str, - intended_for: str | None = None, + intended_for: str &gt;&gt; None = None, position: str | None = None, ) -&gt; bytes: """Return a new PDF with a watermark record appended.</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.13s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2214"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2214_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2214_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2214_1"><button class="btn btn-outline-danger"><span class="job_id">2214 : Job ID b8e2581a77f8436cad36b5d789170e49</span></button></div></a><div aria-labelledby="job_list___sub_heading_2214_1" data-parent="#job_list___sub_accordion_2214" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2214_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=42" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (42, 22), end pos: (42, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -39,7 +39,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str &gt;&gt; None = None, ) -&gt; bytes: """Return a new PDF with a watermark record appended. </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.13s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2215"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2215_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2215_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2215_1"><button class="btn btn-outline-success"><span class="job_id">2215 : Job ID 3f0c423f9fc34dcd8ac1d2423b0381de</span></button></div></a><div aria-labelledby="job_list___sub_heading_2215_1" data-parent="#job_list___sub_accordion_2215" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2215_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=57" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (57, 22), end pos: (57, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -54,7 +54,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str &gt;&gt; None = None, ) -&gt; bool: return True </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T194145347052Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T194146218729Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.88s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2216"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2216_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2216_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2216_1"><button class="btn btn-outline-danger"><span class="job_id">2216 : Job ID fcd068213ad7406390c8239a32b38854</span></button></div></a><div aria-labelledby="job_list___sub_heading_2216_1" data-parent="#job_list___sub_accordion_2216" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2216_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=41" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (41, 26), end pos: (41, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -38,7 +38,7 @@ pdf, secret: str, key: str, - intended_for: str | None = None, + intended_for: str &lt;&lt; None = None, position: str | None = None, ) -&gt; bytes: """Return a new PDF with a watermark record appended.</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.17s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2217"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2217_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2217_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2217_1"><button class="btn btn-outline-danger"><span class="job_id">2217 : Job ID e28c2d5b2c22494f82151f004c6d1e67</span></button></div></a><div aria-labelledby="job_list___sub_heading_2217_1" data-parent="#job_list___sub_accordion_2217" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2217_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=42" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (42, 22), end pos: (42, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -39,7 +39,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str &lt;&lt; None = None, ) -&gt; bytes: """Return a new PDF with a watermark record appended. </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.07s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2218"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2218_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2218_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2218_1"><button class="btn btn-outline-danger"><span class="job_id">2218 : Job ID 9b230a9359e646b490bf4dd5a08fe0f3</span></button></div></a><div aria-labelledby="job_list___sub_heading_2218_1" data-parent="#job_list___sub_accordion_2218" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2218_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=57" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (57, 22), end pos: (57, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -54,7 +54,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str &lt;&lt; None = None, ) -&gt; bool: return True </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.38s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2219"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2219_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2219_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2219_1"><button class="btn btn-outline-success"><span class="job_id">2219 : Job ID 05205a8357ab4dc5bbf0930c1999ba1e</span></button></div></a><div aria-labelledby="job_list___sub_heading_2219_1" data-parent="#job_list___sub_accordion_2219" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2219_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=41" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (41, 26), end pos: (41, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -38,7 +38,7 @@ pdf, secret: str, key: str, - intended_for: str | None = None, + intended_for: str &amp; None = None, position: str | None = None, ) -&gt; bytes: """Return a new PDF with a watermark record appended.</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T153626862438Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T153627768782Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ERROR server:rmap_handler.py:245 Failed to add source PDF to database: No users exist to own RMAP base document; create a user first ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 11 failed, 3 passed, 22 warnings in 19.50s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2220"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2220_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2220_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2220_1"><button class="btn btn-outline-success"><span class="job_id">2220 : Job ID 16ad5776a852483e814a58811b8f7c55</span></button></div></a><div aria-labelledby="job_list___sub_heading_2220_1" data-parent="#job_list___sub_accordion_2220" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2220_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=42" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (42, 22), end pos: (42, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -39,7 +39,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str &amp; None = None, ) -&gt; bytes: """Return a new PDF with a watermark record appended. </pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e2305c4b955f74882: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.78s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2221"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2221_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2221_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2221_1"><button class="btn btn-outline-danger"><span class="job_id">2221 : Job ID 27d2a47a3c0e4df785c4349f60699509</span></button></div></a><div aria-labelledby="job_list___sub_heading_2221_1" data-parent="#job_list___sub_accordion_2221" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2221_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=57" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (57, 22), end pos: (57, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -54,7 +54,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str &amp; None = None, ) -&gt; bool: return True </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.16s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2222"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2222_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2222_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2222_1"><button class="btn btn-outline-danger"><span class="job_id">2222 : Job ID ca8562ce275b4cb591d2660918fd63f3</span></button></div></a><div aria-labelledby="job_list___sub_heading_2222_1" data-parent="#job_list___sub_accordion_2222" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2222_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=41" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (41, 26), end pos: (41, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -38,7 +38,7 @@ pdf, secret: str, key: str, - intended_for: str | None = None, + intended_for: str ^ None = None, position: str | None = None, ) -&gt; bytes: """Return a new PDF with a watermark record appended.</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.33s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2223"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2223_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2223_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2223_1"><button class="btn btn-outline-success"><span class="job_id">2223 : Job ID 415123fec35c454cb39c09e218049b14</span></button></div></a><div aria-labelledby="job_list___sub_heading_2223_1" data-parent="#job_list___sub_accordion_2223" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2223_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=42" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (42, 22), end pos: (42, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -39,7 +39,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str ^ None = None, ) -&gt; bytes: """Return a new PDF with a watermark record appended. </pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614eccbbce2609cf3023: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.61s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2224"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2224_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2224_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2224_1"><button class="btn btn-outline-danger"><span class="job_id">2224 : Job ID a024f09a7ab44aaa846c37e284fd35be</span></button></div></a><div aria-labelledby="job_list___sub_heading_2224_1" data-parent="#job_list___sub_accordion_2224" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2224_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=57" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (57, 22), end pos: (57, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -54,7 +54,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str ^ None = None, ) -&gt; bool: return True </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.33s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2225"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2225_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2225_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2225_1"><button class="btn btn-outline-danger"><span class="job_id">2225 : Job ID cbba01284c3c4d4e953cbe1f8b55e3d1</span></button></div></a><div aria-labelledby="job_list___sub_heading_2225_1" data-parent="#job_list___sub_accordion_2225" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2225_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=73" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (73, 31), end pos: (73, 32)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_USub_UAdd, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -70,7 +70,7 @@ if not eof_matches: return "" - last_eof = eof_matches[-1] + last_eof = eof_matches[+1] # Return everything after the last %%EOF after_eof = text_data[last_eof.end() :] </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.14s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2226"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2226_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2226_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2226_1"><button class="btn btn-outline-success"><span class="job_id">2226 : Job ID 7b07442d28dd44f5b98634030e015d76</span></button></div></a><div aria-labelledby="job_list___sub_heading_2226_1" data-parent="#job_list___sub_accordion_2226" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2226_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=73" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (73, 31), end pos: (73, 32)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_USub_Invert, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -70,7 +70,7 @@ if not eof_matches: return "" - last_eof = eof_matches[-1] + last_eof = eof_matches[~1] # Return everything after the last %%EOF after_eof = text_data[last_eof.end() :] </pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%]</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2227"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2227_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2227_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2227_1"><button class="btn btn-outline-success"><span class="job_id">2227 : Job ID 43e07d08627f4fc782bdac14b448fdbc</span></button></div></a><div aria-labelledby="job_list___sub_heading_2227_1" data-parent="#job_list___sub_accordion_2227" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2227_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=73" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (73, 31), end pos: (73, 32)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_USub_Not, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -70,7 +70,7 @@ if not eof_matches: return "" - last_eof = eof_matches[-1] + last_eof = eof_matches[not 1] # Return everything after the last %%EOF after_eof = text_data[last_eof.end() :] </pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T160424502986Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T160425410817Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.21s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2228"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2228_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2228_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2228_1"><button class="btn btn-outline-danger"><span class="job_id">2228 : Job ID 3e8cda136e02424b83a0c281768081cf</span></button></div></a><div aria-labelledby="job_list___sub_heading_2228_1" data-parent="#job_list___sub_accordion_2228" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2228_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=73" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (73, 31), end pos: (73, 32)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_USub, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -70,7 +70,7 @@ if not eof_matches: return "" - last_eof = eof_matches[-1] + last_eof = eof_matches[1] # Return everything after the last %%EOF after_eof = text_data[last_eof.end() :] </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.28s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2229"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2229_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2229_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2229_1"><button class="btn btn-outline-danger"><span class="job_id">2229 : Job ID 2dce0105aca0462197079e58ef44bdb2</span></button></div></a><div aria-labelledby="job_list___sub_heading_2229_1" data-parent="#job_list___sub_accordion_2229" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2229_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=70" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (70, 11), end pos: (70, 14)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -67,7 +67,7 @@ # Find the last occurrence of %%EOF eof_matches = list(re.finditer(r"%%EOF", text_data)) - if not eof_matches: + if eof_matches: return "" last_eof = eof_matches[-1]</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.05s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2230"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2230_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2230_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2230_1"><button class="btn btn-outline-danger"><span class="job_id">2230 : Job ID 5b5f008eecf14c229af86d651e11c46b</span></button></div></a><div aria-labelledby="job_list___sub_heading_2230_1" data-parent="#job_list___sub_accordion_2230" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2230_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=70" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (70, 11), end pos: (70, 26)</button></a></pre><pre>operator: core/AddNot, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -67,7 +67,7 @@ # Find the last occurrence of %%EOF eof_matches = list(re.finditer(r"%%EOF", text_data)) - if not eof_matches: + if not not eof_matches: return "" last_eof = eof_matches[-1]</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.27s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2231"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2231_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2231_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2231_1"><button class="btn btn-outline-danger"><span class="job_id">2231 : Job ID bf86de93f36b40078b4b821d3c503b2b</span></button></div></a><div aria-labelledby="job_list___sub_heading_2231_1" data-parent="#job_list___sub_accordion_2231" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2231_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=59" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (59, 15), end pos: (59, 19)</button></a></pre><pre>operator: core/ReplaceTrueWithFalse, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -56,7 +56,7 @@ pdf: PdfSource, position: str | None = None, ) -&gt; bool: - return True + return False def read_secret(self, pdf, key: str) -&gt; str: """Extract the secret if present.</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.97s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2232"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2232_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2232_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2232_1"><button class="btn btn-outline-danger"><span class="job_id">2232 : Job ID 6d226cbf863c458cb112d5a9e2469206</span></button></div></a><div aria-labelledby="job_list___sub_heading_2232_1" data-parent="#job_list___sub_accordion_2232" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2232_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=73" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (73, 32), end pos: (73, 33)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -70,7 +70,7 @@ if not eof_matches: return "" - last_eof = eof_matches[-1] + last_eof = eof_matches[- 2] # Return everything after the last %%EOF after_eof = text_data[last_eof.end() :] </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.98s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2233"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2233_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2233_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2233_1"><button class="btn btn-outline-danger"><span class="job_id">2233 : Job ID 013b2855b4ec40f399e78dad960bd0d8</span></button></div></a><div aria-labelledby="job_list___sub_heading_2233_1" data-parent="#job_list___sub_accordion_2233" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2233_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=73" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (73, 32), end pos: (73, 33)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -70,7 +70,7 @@ if not eof_matches: return "" - last_eof = eof_matches[-1] + last_eof = eof_matches[- 0] # Return everything after the last %%EOF after_eof = text_data[last_eof.end() :] </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.28s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2234"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2234_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2234_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2234_1"><button class="btn btn-outline-success"><span class="job_id">2234 : Job ID fe754e8e27f5442685abf47f9d8ac337</span></button></div></a><div aria-labelledby="job_list___sub_heading_2234_1" data-parent="#job_list___sub_accordion_2234" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2234_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=old methods\unsafe_bash_bridge_append_eof.py&amp;line=29" class="text-secondary"><button class="btn btn-outline-dark">old methods\unsafe_bash_bridge_append_eof.py, start pos: (29, 4), end pos: (30, 0)</button></a></pre><pre>operator: core/RemoveDecorator, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- aold methods\unsafe_bash_bridge_append_eof.py +++ bold methods\unsafe_bash_bridge_append_eof.py @@ -21,12 +21,6 @@ """Toy method that appends a watermark record after the PDF EOF.""" name = "bash-bridge-eof" - - # --------------------- - # Public API overrides - # --------------------- - - @staticmethod def get_usage() -&gt; str: return ( "Toy method that appends a watermark record after the PDF EOF. "</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T052156577737Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T052157431947Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.47s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2235"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2235_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2235_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2235_1"><button class="btn btn-outline-success"><span class="job_id">2235 : Job ID 2aa46fa18a474604bd8c4c301ed2002b</span></button></div></a><div aria-labelledby="job_list___sub_heading_2235_1" data-parent="#job_list___sub_accordion_2235" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2235_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=98" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (98, 29), end pos: (98, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -95,7 +95,7 @@ ValueError If the resolved bytes do not appear to be a PDF file. """ - if isinstance(src, bytes | bytearray): + if isinstance(src, bytes + bytearray): data = bytes(src) elif isinstance(src, str | os.PathLike): with open(os.fspath(src), "rb") as fh:</pre></div><div class="alert alert-secondary"><pre class="diff">.........FF..F [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 47 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 52 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:400: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1226 Error when attempting to read watermark for document 2: unsupported operand type(s) for +: 'type' and 'type' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 3 failed, 11 passed, 22 warnings in 20.53s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2236"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2236_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2236_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2236_1"><button class="btn btn-outline-success"><span class="job_id">2236 : Job ID a4afc93844994bb3a24d5d89d78bd521</span></button></div></a><div aria-labelledby="job_list___sub_heading_2236_1" data-parent="#job_list___sub_accordion_2236" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2236_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=100" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (100, 29), end pos: (100, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -97,7 +97,7 @@ """ if isinstance(src, bytes | bytearray): data = bytes(src) - elif isinstance(src, str | os.PathLike): + elif isinstance(src, str + os.PathLike): with open(os.fspath(src), "rb") as fh: data = fh.read() elif hasattr(src, "read"):</pre></div><div class="alert alert-secondary"><pre class="diff">.........FF..F [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 47 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 52 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:400: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1226 Error when attempting to read watermark for document 2: unsupported operand type(s) for +: 'type' and 'ABCMeta' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 3 failed, 11 passed, 22 warnings in 19.97s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2237"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2237_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2237_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2237_1"><button class="btn btn-outline-danger"><span class="job_id">2237 : Job ID 838ad17b623b4951b32f9c4c7bf2276b</span></button></div></a><div aria-labelledby="job_list___sub_heading_2237_1" data-parent="#job_list___sub_accordion_2237" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2237_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=163" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (163, 26), end pos: (163, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -160,7 +160,7 @@ pdf: PdfSource, secret: str, key: str, - intended_for: str | None = None, + intended_for: str + None = None, position: str | None = None, ) -&gt; bytes: """Return a new PDF with an embedded watermark.</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.91s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2238"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2238_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2238_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2238_1"><button class="btn btn-outline-success"><span class="job_id">2238 : Job ID 3af117d122bf4bdc9e5b2362fd4069b2</span></button></div></a><div aria-labelledby="job_list___sub_heading_2238_1" data-parent="#job_list___sub_accordion_2238" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2238_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=164" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (164, 22), end pos: (164, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -161,7 +161,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str + None = None, ) -&gt; bytes: """Return a new PDF with an embedded watermark. </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T060219360093Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T060220402495Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.70s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2239"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2239_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2239_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2239_1"><button class="btn btn-outline-danger"><span class="job_id">2239 : Job ID f1d711543dbf4408983fcec0e1b68004</span></button></div></a><div aria-labelledby="job_list___sub_heading_2239_1" data-parent="#job_list___sub_accordion_2239" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2239_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=203" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (203, 22), end pos: (203, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -200,7 +200,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str + None = None, ) -&gt; bool: """Return whether the method is applicable on this specific method </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.06s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2240"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2240_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2240_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2240_1"><button class="btn btn-outline-success"><span class="job_id">2240 : Job ID 38cca4adc0a74619986d04dd62428008</span></button></div></a><div aria-labelledby="job_list___sub_heading_2240_1" data-parent="#job_list___sub_accordion_2240" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2240_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=98" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (98, 29), end pos: (98, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -95,7 +95,7 @@ ValueError If the resolved bytes do not appear to be a PDF file. """ - if isinstance(src, bytes | bytearray): + if isinstance(src, bytes - bytearray): data = bytes(src) elif isinstance(src, str | os.PathLike): with open(os.fspath(src), "rb") as fh:</pre></div><div class="alert alert-secondary"><pre class="diff">.........FF..F [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 47 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 52 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:400: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1226 Error when attempting to read watermark for document 2: unsupported operand type(s) for -: 'type' and 'type' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 3 failed, 11 passed, 22 warnings in 19.68s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2241"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2241_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2241_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2241_1"><button class="btn btn-outline-success"><span class="job_id">2241 : Job ID fe3b173128784bdca66196d962811b91</span></button></div></a><div aria-labelledby="job_list___sub_heading_2241_1" data-parent="#job_list___sub_accordion_2241" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2241_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=100" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (100, 29), end pos: (100, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -97,7 +97,7 @@ """ if isinstance(src, bytes | bytearray): data = bytes(src) - elif isinstance(src, str | os.PathLike): + elif isinstance(src, str - os.PathLike): with open(os.fspath(src), "rb") as fh: data = fh.read() elif hasattr(src, "read"):</pre></div><div class="alert alert-secondary"><pre class="diff">.........FF..F [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 47 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 52 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:400: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1226 Error when attempting to read watermark for document 2: unsupported operand type(s) for -: 'type' and 'ABCMeta' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 3 failed, 11 passed, 22 warnings in 19.50s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2242"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2242_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2242_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2242_1"><button class="btn btn-outline-danger"><span class="job_id">2242 : Job ID 78655a028fde4acdaee9ae2df75ba8a5</span></button></div></a><div aria-labelledby="job_list___sub_heading_2242_1" data-parent="#job_list___sub_accordion_2242" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2242_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=163" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (163, 26), end pos: (163, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -160,7 +160,7 @@ pdf: PdfSource, secret: str, key: str, - intended_for: str | None = None, + intended_for: str - None = None, position: str | None = None, ) -&gt; bytes: """Return a new PDF with an embedded watermark.</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.53s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2243"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2243_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2243_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2243_1"><button class="btn btn-outline-success"><span class="job_id">2243 : Job ID 6b12629ad6914169bad1555aa690f644</span></button></div></a><div aria-labelledby="job_list___sub_heading_2243_1" data-parent="#job_list___sub_accordion_2243" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2243_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=164" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (164, 22), end pos: (164, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -161,7 +161,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str - None = None, ) -&gt; bytes: """Return a new PDF with an embedded watermark. </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T022217219916Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T022218227001Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.35s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2244"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2244_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2244_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2244_1"><button class="btn btn-outline-danger"><span class="job_id">2244 : Job ID 52b2146735ec47fda9e322241cc6446b</span></button></div></a><div aria-labelledby="job_list___sub_heading_2244_1" data-parent="#job_list___sub_accordion_2244" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2244_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=203" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (203, 22), end pos: (203, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -200,7 +200,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str - None = None, ) -&gt; bool: """Return whether the method is applicable on this specific method </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.26s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2245"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2245_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2245_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2245_1"><button class="btn btn-outline-success"><span class="job_id">2245 : Job ID ee185e25a2564029a80eba1b0aaf70cd</span></button></div></a><div aria-labelledby="job_list___sub_heading_2245_1" data-parent="#job_list___sub_accordion_2245" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2245_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=98" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (98, 29), end pos: (98, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -95,7 +95,7 @@ ValueError If the resolved bytes do not appear to be a PDF file. """ - if isinstance(src, bytes | bytearray): + if isinstance(src, bytes * bytearray): data = bytes(src) elif isinstance(src, str | os.PathLike): with open(os.fspath(src), "rb") as fh:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T152637912368Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T152638754277Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 11 failed, 3 passed, 22 warnings in 19.33s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2246"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2246_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2246_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2246_1"><button class="btn btn-outline-success"><span class="job_id">2246 : Job ID 55307b5c34a84fe687f654d439c53551</span></button></div></a><div aria-labelledby="job_list___sub_heading_2246_1" data-parent="#job_list___sub_accordion_2246" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2246_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=100" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (100, 29), end pos: (100, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -97,7 +97,7 @@ """ if isinstance(src, bytes | bytearray): data = bytes(src) - elif isinstance(src, str | os.PathLike): + elif isinstance(src, str * os.PathLike): with open(os.fspath(src), "rb") as fh: data = fh.read() elif hasattr(src, "read"):</pre></div><div class="alert alert-secondary"><pre class="diff">.........FF..F [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 47 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 52 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:400: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1226 Error when attempting to read watermark for document 2: unsupported operand type(s) for *: 'type' and 'ABCMeta' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 3 failed, 11 passed, 22 warnings in 19.53s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2247"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2247_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2247_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2247_1"><button class="btn btn-outline-danger"><span class="job_id">2247 : Job ID d3d9d412d4fe4218b38e972c03a08fbe</span></button></div></a><div aria-labelledby="job_list___sub_heading_2247_1" data-parent="#job_list___sub_accordion_2247" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2247_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=163" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (163, 26), end pos: (163, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -160,7 +160,7 @@ pdf: PdfSource, secret: str, key: str, - intended_for: str | None = None, + intended_for: str * None = None, position: str | None = None, ) -&gt; bytes: """Return a new PDF with an embedded watermark.</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.00s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2248"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2248_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2248_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2248_1"><button class="btn btn-outline-success"><span class="job_id">2248 : Job ID 86f4b0d793ae40b39d88cb5bd162f1f3</span></button></div></a><div aria-labelledby="job_list___sub_heading_2248_1" data-parent="#job_list___sub_accordion_2248" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2248_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=164" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (164, 22), end pos: (164, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -161,7 +161,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str * None = None, ) -&gt; bytes: """Return a new PDF with an embedded watermark. </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T193733527556Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T193734465082Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.94s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2249"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2249_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2249_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2249_1"><button class="btn btn-outline-success"><span class="job_id">2249 : Job ID 41bfb0bcb4af40dd97ef485f6ae7d5a1</span></button></div></a><div aria-labelledby="job_list___sub_heading_2249_1" data-parent="#job_list___sub_accordion_2249" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2249_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=203" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (203, 22), end pos: (203, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -200,7 +200,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str * None = None, ) -&gt; bool: """Return whether the method is applicable on this specific method </pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%]</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2250"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2250_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2250_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2250_1"><button class="btn btn-outline-success"><span class="job_id">2250 : Job ID 74839aa773c8469988eb5d3b375722d3</span></button></div></a><div aria-labelledby="job_list___sub_heading_2250_1" data-parent="#job_list___sub_accordion_2250" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2250_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=98" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (98, 29), end pos: (98, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -95,7 +95,7 @@ ValueError If the resolved bytes do not appear to be a PDF file. """ - if isinstance(src, bytes | bytearray): + if isinstance(src, bytes / bytearray): data = bytes(src) elif isinstance(src, str | os.PathLike): with open(os.fspath(src), "rb") as fh:</pre></div><div class="alert alert-secondary"><pre class="diff">.........FF..F [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 47 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 52 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:400: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1226 Error when attempting to read watermark for document 2: unsupported operand type(s) for /: 'type' and 'type' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 3 failed, 11 passed, 22 warnings in 19.58s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2251"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2251_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2251_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2251_1"><button class="btn btn-outline-success"><span class="job_id">2251 : Job ID fa17b608f05e4a0e86dee5986815c60a</span></button></div></a><div aria-labelledby="job_list___sub_heading_2251_1" data-parent="#job_list___sub_accordion_2251" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2251_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=100" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (100, 29), end pos: (100, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -97,7 +97,7 @@ """ if isinstance(src, bytes | bytearray): data = bytes(src) - elif isinstance(src, str | os.PathLike): + elif isinstance(src, str / os.PathLike): with open(os.fspath(src), "rb") as fh: data = fh.read() elif hasattr(src, "read"):</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T234033684839Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T234034620949Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 10 failed, 4 passed, 22 warnings in 19.42s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2252"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2252_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2252_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2252_1"><button class="btn btn-outline-danger"><span class="job_id">2252 : Job ID 7150929fbf4b43b890ad7bc8cda9e59c</span></button></div></a><div aria-labelledby="job_list___sub_heading_2252_1" data-parent="#job_list___sub_accordion_2252" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2252_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=163" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (163, 26), end pos: (163, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -160,7 +160,7 @@ pdf: PdfSource, secret: str, key: str, - intended_for: str | None = None, + intended_for: str / None = None, position: str | None = None, ) -&gt; bytes: """Return a new PDF with an embedded watermark.</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.31s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2253"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2253_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2253_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2253_1"><button class="btn btn-outline-danger"><span class="job_id">2253 : Job ID 8615cc4479b44f7b92cdd2cf631a7b07</span></button></div></a><div aria-labelledby="job_list___sub_heading_2253_1" data-parent="#job_list___sub_accordion_2253" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2253_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=164" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (164, 22), end pos: (164, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -161,7 +161,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str / None = None, ) -&gt; bytes: """Return a new PDF with an embedded watermark. </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.03s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2254"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2254_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2254_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2254_1"><button class="btn btn-outline-danger"><span class="job_id">2254 : Job ID 3b676003c41841009befd7d6f038d948</span></button></div></a><div aria-labelledby="job_list___sub_heading_2254_1" data-parent="#job_list___sub_accordion_2254" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2254_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=203" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (203, 22), end pos: (203, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -200,7 +200,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str / None = None, ) -&gt; bool: """Return whether the method is applicable on this specific method </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.06s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2255"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2255_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2255_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2255_1"><button class="btn btn-outline-success"><span class="job_id">2255 : Job ID 9af4493eb342433ab518a1aa25dfdf7d</span></button></div></a><div aria-labelledby="job_list___sub_heading_2255_1" data-parent="#job_list___sub_accordion_2255" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2255_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=98" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (98, 29), end pos: (98, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -95,7 +95,7 @@ ValueError If the resolved bytes do not appear to be a PDF file. """ - if isinstance(src, bytes | bytearray): + if isinstance(src, bytes // bytearray): data = bytes(src) elif isinstance(src, str | os.PathLike): with open(os.fspath(src), "rb") as fh:</pre></div><div class="alert alert-secondary"><pre class="diff">.........FF..F [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 47 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 52 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:400: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1226 Error when attempting to read watermark for document 2: unsupported operand type(s) for //: 'type' and 'type' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 3 failed, 11 passed, 22 warnings in 19.82s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2256"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2256_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2256_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2256_1"><button class="btn btn-outline-success"><span class="job_id">2256 : Job ID 70447fef3f974062ab7d8cffb10a5ea9</span></button></div></a><div aria-labelledby="job_list___sub_heading_2256_1" data-parent="#job_list___sub_accordion_2256" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2256_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=100" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (100, 29), end pos: (100, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -97,7 +97,7 @@ """ if isinstance(src, bytes | bytearray): data = bytes(src) - elif isinstance(src, str | os.PathLike): + elif isinstance(src, str // os.PathLike): with open(os.fspath(src), "rb") as fh: data = fh.read() elif hasattr(src, "read"):</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 47 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.66s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2257"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2257_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2257_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2257_1"><button class="btn btn-outline-danger"><span class="job_id">2257 : Job ID 20abe5166270456c8acfa265391c2500</span></button></div></a><div aria-labelledby="job_list___sub_heading_2257_1" data-parent="#job_list___sub_accordion_2257" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2257_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=163" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (163, 26), end pos: (163, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -160,7 +160,7 @@ pdf: PdfSource, secret: str, key: str, - intended_for: str | None = None, + intended_for: str // None = None, position: str | None = None, ) -&gt; bytes: """Return a new PDF with an embedded watermark.</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.56s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2258"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2258_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2258_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2258_1"><button class="btn btn-outline-danger"><span class="job_id">2258 : Job ID 5efafe0be56b4d00a212ff4e48e4c1ac</span></button></div></a><div aria-labelledby="job_list___sub_heading_2258_1" data-parent="#job_list___sub_accordion_2258" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2258_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=164" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (164, 22), end pos: (164, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -161,7 +161,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str // None = None, ) -&gt; bytes: """Return a new PDF with an embedded watermark. </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.08s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2259"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2259_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2259_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2259_1"><button class="btn btn-outline-danger"><span class="job_id">2259 : Job ID 8752daeade5b4e26a26fd95a91d2829a</span></button></div></a><div aria-labelledby="job_list___sub_heading_2259_1" data-parent="#job_list___sub_accordion_2259" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2259_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=203" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (203, 22), end pos: (203, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -200,7 +200,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str // None = None, ) -&gt; bool: """Return whether the method is applicable on this specific method </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.09s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2260"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2260_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2260_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2260_1"><button class="btn btn-outline-success"><span class="job_id">2260 : Job ID 2b34004be45643658ae5d677c00357f9</span></button></div></a><div aria-labelledby="job_list___sub_heading_2260_1" data-parent="#job_list___sub_accordion_2260" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2260_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=98" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (98, 29), end pos: (98, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -95,7 +95,7 @@ ValueError If the resolved bytes do not appear to be a PDF file. """ - if isinstance(src, bytes | bytearray): + if isinstance(src, bytes % bytearray): data = bytes(src) elif isinstance(src, str | os.PathLike): with open(os.fspath(src), "rb") as fh:</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 47 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.71s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2261"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2261_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2261_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2261_1"><button class="btn btn-outline-success"><span class="job_id">2261 : Job ID c7013a5399094851933706192d321c3b</span></button></div></a><div aria-labelledby="job_list___sub_heading_2261_1" data-parent="#job_list___sub_accordion_2261" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2261_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=100" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (100, 29), end pos: (100, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -97,7 +97,7 @@ """ if isinstance(src, bytes | bytearray): data = bytes(src) - elif isinstance(src, str | os.PathLike): + elif isinstance(src, str % os.PathLike): with open(os.fspath(src), "rb") as fh: data = fh.read() elif hasattr(src, "read"):</pre></div><div class="alert alert-secondary"><pre class="diff">.........FF..F [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 47 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 52 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:400: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1226 Error when attempting to read watermark for document 2: unsupported operand type(s) for %: 'type' and 'ABCMeta' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 3 failed, 11 passed, 22 warnings in 19.56s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2262"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2262_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2262_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2262_1"><button class="btn btn-outline-success"><span class="job_id">2262 : Job ID 49fa7d0374f34d6997c2ee952a691c7b</span></button></div></a><div aria-labelledby="job_list___sub_heading_2262_1" data-parent="#job_list___sub_accordion_2262" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2262_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=163" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (163, 26), end pos: (163, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -160,7 +160,7 @@ pdf: PdfSource, secret: str, key: str, - intended_for: str | None = None, + intended_for: str % None = None, position: str | None = None, ) -&gt; bytes: """Return a new PDF with an embedded watermark.</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T020112003669Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T020112970136Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.38s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2263"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2263_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2263_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2263_1"><button class="btn btn-outline-danger"><span class="job_id">2263 : Job ID 3e52608b7c834d4aa682acedb0121e77</span></button></div></a><div aria-labelledby="job_list___sub_heading_2263_1" data-parent="#job_list___sub_accordion_2263" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2263_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=164" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (164, 22), end pos: (164, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -161,7 +161,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str % None = None, ) -&gt; bytes: """Return a new PDF with an embedded watermark. </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.40s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2264"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2264_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2264_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2264_1"><button class="btn btn-outline-danger"><span class="job_id">2264 : Job ID d89f9f020abf49bc9f4326d457b2eac4</span></button></div></a><div aria-labelledby="job_list___sub_heading_2264_1" data-parent="#job_list___sub_accordion_2264" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2264_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=203" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (203, 22), end pos: (203, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -200,7 +200,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str % None = None, ) -&gt; bool: """Return whether the method is applicable on this specific method </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.09s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2265"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2265_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2265_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2265_1"><button class="btn btn-outline-success"><span class="job_id">2265 : Job ID 1cfc7093517e48f986f3a4b5dc0f8d78</span></button></div></a><div aria-labelledby="job_list___sub_heading_2265_1" data-parent="#job_list___sub_accordion_2265" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2265_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=98" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (98, 29), end pos: (98, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -95,7 +95,7 @@ ValueError If the resolved bytes do not appear to be a PDF file. """ - if isinstance(src, bytes | bytearray): + if isinstance(src, bytes ** bytearray): data = bytes(src) elif isinstance(src, str | os.PathLike): with open(os.fspath(src), "rb") as fh:</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 47 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.59s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2266"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2266_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2266_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2266_1"><button class="btn btn-outline-success"><span class="job_id">2266 : Job ID 5b4bd4fd5c504b6282120e6878c8510d</span></button></div></a><div aria-labelledby="job_list___sub_heading_2266_1" data-parent="#job_list___sub_accordion_2266" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2266_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=100" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (100, 29), end pos: (100, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -97,7 +97,7 @@ """ if isinstance(src, bytes | bytearray): data = bytes(src) - elif isinstance(src, str | os.PathLike): + elif isinstance(src, str ** os.PathLike): with open(os.fspath(src), "rb") as fh: data = fh.read() elif hasattr(src, "read"):</pre></div><div class="alert alert-secondary"><pre class="diff">.........FF..F [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 47 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 52 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:400: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1226 Error when attempting to read watermark for document 2: unsupported operand type(s) for ** or pow(): 'type' and 'ABCMeta' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 3 failed, 11 passed, 22 warnings in 19.68s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2267"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2267_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2267_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2267_1"><button class="btn btn-outline-danger"><span class="job_id">2267 : Job ID 68c0e5a9eedf4ba197f83e2c8b9e17b7</span></button></div></a><div aria-labelledby="job_list___sub_heading_2267_1" data-parent="#job_list___sub_accordion_2267" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2267_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=163" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (163, 26), end pos: (163, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -160,7 +160,7 @@ pdf: PdfSource, secret: str, key: str, - intended_for: str | None = None, + intended_for: str ** None = None, position: str | None = None, ) -&gt; bytes: """Return a new PDF with an embedded watermark.</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.38s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2268"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2268_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2268_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2268_1"><button class="btn btn-outline-danger"><span class="job_id">2268 : Job ID 89e0c18117d94e8ea918199d365b0997</span></button></div></a><div aria-labelledby="job_list___sub_heading_2268_1" data-parent="#job_list___sub_accordion_2268" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2268_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=164" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (164, 22), end pos: (164, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -161,7 +161,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str ** None = None, ) -&gt; bytes: """Return a new PDF with an embedded watermark. </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.47s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2269"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2269_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2269_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2269_1"><button class="btn btn-outline-danger"><span class="job_id">2269 : Job ID a98143a1944c4e5e945f7728bb02d0bc</span></button></div></a><div aria-labelledby="job_list___sub_heading_2269_1" data-parent="#job_list___sub_accordion_2269" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2269_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=203" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (203, 22), end pos: (203, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -200,7 +200,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str ** None = None, ) -&gt; bool: """Return whether the method is applicable on this specific method </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.07s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2270"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2270_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2270_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2270_1"><button class="btn btn-outline-success"><span class="job_id">2270 : Job ID 2ec1af5c28c8487c8758af66f293998c</span></button></div></a><div aria-labelledby="job_list___sub_heading_2270_1" data-parent="#job_list___sub_accordion_2270" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2270_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=98" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (98, 29), end pos: (98, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -95,7 +95,7 @@ ValueError If the resolved bytes do not appear to be a PDF file. """ - if isinstance(src, bytes | bytearray): + if isinstance(src, bytes &gt;&gt; bytearray): data = bytes(src) elif isinstance(src, str | os.PathLike): with open(os.fspath(src), "rb") as fh:</pre></div><div class="alert alert-secondary"><pre class="diff">.........FF..F [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 47 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 52 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:400: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1226 Error when attempting to read watermark for document 2: unsupported operand type(s) for &gt;&gt;: 'type' and 'type' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 3 failed, 11 passed, 22 warnings in 19.53s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2271"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2271_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2271_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2271_1"><button class="btn btn-outline-success"><span class="job_id">2271 : Job ID 7b520f1920a1486fa589f5f6745667aa</span></button></div></a><div aria-labelledby="job_list___sub_heading_2271_1" data-parent="#job_list___sub_accordion_2271" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2271_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=100" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (100, 29), end pos: (100, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -97,7 +97,7 @@ """ if isinstance(src, bytes | bytearray): data = bytes(src) - elif isinstance(src, str | os.PathLike): + elif isinstance(src, str &gt;&gt; os.PathLike): with open(os.fspath(src), "rb") as fh: data = fh.read() elif hasattr(src, "read"):</pre></div><div class="alert alert-secondary"><pre class="diff">.........FF..F [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 47 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 52 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:400: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1226 Error when attempting to read watermark for document 2: unsupported operand type(s) for &gt;&gt;: 'type' and 'ABCMeta' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 3 failed, 11 passed, 22 warnings in 19.60s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2272"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2272_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2272_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2272_1"><button class="btn btn-outline-danger"><span class="job_id">2272 : Job ID 25b26b61755443629be67b0e97761262</span></button></div></a><div aria-labelledby="job_list___sub_heading_2272_1" data-parent="#job_list___sub_accordion_2272" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2272_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=163" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (163, 26), end pos: (163, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -160,7 +160,7 @@ pdf: PdfSource, secret: str, key: str, - intended_for: str | None = None, + intended_for: str &gt;&gt; None = None, position: str | None = None, ) -&gt; bytes: """Return a new PDF with an embedded watermark.</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.02s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2273"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2273_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2273_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2273_1"><button class="btn btn-outline-success"><span class="job_id">2273 : Job ID fa6676665b13409dbb1673d84040679c</span></button></div></a><div aria-labelledby="job_list___sub_heading_2273_1" data-parent="#job_list___sub_accordion_2273" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2273_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=164" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (164, 22), end pos: (164, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -161,7 +161,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str &gt;&gt; None = None, ) -&gt; bytes: """Return a new PDF with an embedded watermark. </pre></div><div class="alert alert-secondary"><pre class="diff">...F.......... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:228: in open request = self._request_from_builder_args(args, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:200: in _request_from_builder_args return builder.get_request() ^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:764: in get_request return cls(self.get_environ()) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:688: in get_environ input_stream, content_length, boundary = stream_encode_multipart( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:130: in stream_encode_multipart write_binary(encoder.send_event(Data(data=chunk, more_data=True))) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:81: in write_binary return stream.write(s) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... 1 failed, 13 passed, 22 warnings in 20.12s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2274"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2274_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2274_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2274_1"><button class="btn btn-outline-success"><span class="job_id">2274 : Job ID b1ae423a89504562980f0aa663ddab50</span></button></div></a><div aria-labelledby="job_list___sub_heading_2274_1" data-parent="#job_list___sub_accordion_2274" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2274_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=203" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (203, 22), end pos: (203, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -200,7 +200,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str &gt;&gt; None = None, ) -&gt; bool: """Return whether the method is applicable on this specific method </pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e082eb04fe2cfaa1c: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 21.26s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2275"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2275_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2275_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2275_1"><button class="btn btn-outline-success"><span class="job_id">2275 : Job ID dfeb22ae7b1345ee8d1cfcc3a0c894d6</span></button></div></a><div aria-labelledby="job_list___sub_heading_2275_1" data-parent="#job_list___sub_accordion_2275" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2275_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=98" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (98, 29), end pos: (98, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -95,7 +95,7 @@ ValueError If the resolved bytes do not appear to be a PDF file. """ - if isinstance(src, bytes | bytearray): + if isinstance(src, bytes &lt;&lt; bytearray): data = bytes(src) elif isinstance(src, str | os.PathLike): with open(os.fspath(src), "rb") as fh:</pre></div><div class="alert alert-secondary"><pre class="diff">.........FF..F [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 47 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 52 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:400: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1226 Error when attempting to read watermark for document 2: unsupported operand type(s) for &lt;&lt;: 'type' and 'type' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 3 failed, 11 passed, 22 warnings in 19.43s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2276"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2276_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2276_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2276_1"><button class="btn btn-outline-success"><span class="job_id">2276 : Job ID e79b0cb0539c4e10922f36c3d20b0355</span></button></div></a><div aria-labelledby="job_list___sub_heading_2276_1" data-parent="#job_list___sub_accordion_2276" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2276_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=100" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (100, 29), end pos: (100, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -97,7 +97,7 @@ """ if isinstance(src, bytes | bytearray): data = bytes(src) - elif isinstance(src, str | os.PathLike): + elif isinstance(src, str &lt;&lt; os.PathLike): with open(os.fspath(src), "rb") as fh: data = fh.read() elif hasattr(src, "read"):</pre></div><div class="alert alert-secondary"><pre class="diff">.........FF..F [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 47 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 52 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:400: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1226 Error when attempting to read watermark for document 2: unsupported operand type(s) for &lt;&lt;: 'type' and 'ABCMeta' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 3 failed, 11 passed, 22 warnings in 19.47s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2277"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2277_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2277_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2277_1"><button class="btn btn-outline-success"><span class="job_id">2277 : Job ID 1342fa73dda04991be6019e39bbfc17d</span></button></div></a><div aria-labelledby="job_list___sub_heading_2277_1" data-parent="#job_list___sub_accordion_2277" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2277_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=163" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (163, 26), end pos: (163, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -160,7 +160,7 @@ pdf: PdfSource, secret: str, key: str, - intended_for: str | None = None, + intended_for: str &lt;&lt; None = None, position: str | None = None, ) -&gt; bytes: """Return a new PDF with an embedded watermark.</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T205451703071Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T205452737234Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 20.65s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2278"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2278_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2278_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2278_1"><button class="btn btn-outline-danger"><span class="job_id">2278 : Job ID 9f8a0bc60c0a496fbc5b76223ee92ea0</span></button></div></a><div aria-labelledby="job_list___sub_heading_2278_1" data-parent="#job_list___sub_accordion_2278" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2278_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=164" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (164, 22), end pos: (164, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -161,7 +161,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str &lt;&lt; None = None, ) -&gt; bytes: """Return a new PDF with an embedded watermark. </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.15s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2279"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2279_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2279_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2279_1"><button class="btn btn-outline-danger"><span class="job_id">2279 : Job ID e2d9bfc922334a0d9959813d5ced51dd</span></button></div></a><div aria-labelledby="job_list___sub_heading_2279_1" data-parent="#job_list___sub_accordion_2279" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2279_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=203" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (203, 22), end pos: (203, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -200,7 +200,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str &lt;&lt; None = None, ) -&gt; bool: """Return whether the method is applicable on this specific method </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.11s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2280"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2280_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2280_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2280_1"><button class="btn btn-outline-success"><span class="job_id">2280 : Job ID e78e7c05111b43f588f2ca3d474533bf</span></button></div></a><div aria-labelledby="job_list___sub_heading_2280_1" data-parent="#job_list___sub_accordion_2280" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2280_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=98" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (98, 29), end pos: (98, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -95,7 +95,7 @@ ValueError If the resolved bytes do not appear to be a PDF file. """ - if isinstance(src, bytes | bytearray): + if isinstance(src, bytes &amp; bytearray): data = bytes(src) elif isinstance(src, str | os.PathLike): with open(os.fspath(src), "rb") as fh:</pre></div><div class="alert alert-secondary"><pre class="diff">.........FF..F [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 47 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 52 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:400: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1226 Error when attempting to read watermark for document 2: unsupported operand type(s) for &amp;: 'type' and 'type' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 3 failed, 11 passed, 22 warnings in 19.94s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2281"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2281_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2281_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2281_1"><button class="btn btn-outline-success"><span class="job_id">2281 : Job ID 522abcb522984a3b916c8b7ede1da682</span></button></div></a><div aria-labelledby="job_list___sub_heading_2281_1" data-parent="#job_list___sub_accordion_2281" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2281_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=100" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (100, 29), end pos: (100, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -97,7 +97,7 @@ """ if isinstance(src, bytes | bytearray): data = bytes(src) - elif isinstance(src, str | os.PathLike): + elif isinstance(src, str &amp; os.PathLike): with open(os.fspath(src), "rb") as fh: data = fh.read() elif hasattr(src, "read"):</pre></div><div class="alert alert-secondary"><pre class="diff">.........FF..F [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 47 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 52 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:400: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1226 Error when attempting to read watermark for document 2: unsupported operand type(s) for &amp;: 'type' and 'ABCMeta' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 3 failed, 11 passed, 22 warnings in 19.38s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2282"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2282_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2282_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2282_1"><button class="btn btn-outline-success"><span class="job_id">2282 : Job ID 9b1cd1db972f4405bb2aef15d445856d</span></button></div></a><div aria-labelledby="job_list___sub_heading_2282_1" data-parent="#job_list___sub_accordion_2282" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2282_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=163" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (163, 26), end pos: (163, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -160,7 +160,7 @@ pdf: PdfSource, secret: str, key: str, - intended_for: str | None = None, + intended_for: str &amp; None = None, position: str | None = None, ) -&gt; bytes: """Return a new PDF with an embedded watermark.</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ee67e1b0c45e9e3fa: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 21.28s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2283"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2283_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2283_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2283_1"><button class="btn btn-outline-danger"><span class="job_id">2283 : Job ID 10397b73d35448109592232609940ffc</span></button></div></a><div aria-labelledby="job_list___sub_heading_2283_1" data-parent="#job_list___sub_accordion_2283" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2283_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=164" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (164, 22), end pos: (164, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -161,7 +161,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str &amp; None = None, ) -&gt; bytes: """Return a new PDF with an embedded watermark. </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.22s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2284"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2284_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2284_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2284_1"><button class="btn btn-outline-danger"><span class="job_id">2284 : Job ID c8cf75cc4e5c40588689e5f50b596be7</span></button></div></a><div aria-labelledby="job_list___sub_heading_2284_1" data-parent="#job_list___sub_accordion_2284" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2284_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=203" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (203, 22), end pos: (203, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -200,7 +200,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str &amp; None = None, ) -&gt; bool: """Return whether the method is applicable on this specific method </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.60s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2285"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2285_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2285_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2285_1"><button class="btn btn-outline-success"><span class="job_id">2285 : Job ID 4e7f75612b1c46b092d6c8c2d8bd79bc</span></button></div></a><div aria-labelledby="job_list___sub_heading_2285_1" data-parent="#job_list___sub_accordion_2285" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2285_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=98" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (98, 29), end pos: (98, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -95,7 +95,7 @@ ValueError If the resolved bytes do not appear to be a PDF file. """ - if isinstance(src, bytes | bytearray): + if isinstance(src, bytes ^ bytearray): data = bytes(src) elif isinstance(src, str | os.PathLike): with open(os.fspath(src), "rb") as fh:</pre></div><div class="alert alert-secondary"><pre class="diff">.........FF..F [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 47 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 52 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:400: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1226 Error when attempting to read watermark for document 2: unsupported operand type(s) for ^: 'type' and 'type' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 3 failed, 11 passed, 22 warnings in 19.97s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2286"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2286_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2286_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2286_1"><button class="btn btn-outline-success"><span class="job_id">2286 : Job ID 92b2b2e8634b44048a8ff73fef8ebe72</span></button></div></a><div aria-labelledby="job_list___sub_heading_2286_1" data-parent="#job_list___sub_accordion_2286" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2286_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=100" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (100, 29), end pos: (100, 30)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -97,7 +97,7 @@ """ if isinstance(src, bytes | bytearray): data = bytes(src) - elif isinstance(src, str | os.PathLike): + elif isinstance(src, str ^ os.PathLike): with open(os.fspath(src), "rb") as fh: data = fh.read() elif hasattr(src, "read"):</pre></div><div class="alert alert-secondary"><pre class="diff">.........FF..F [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 47 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 52 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:400: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1226 Error when attempting to read watermark for document 2: unsupported operand type(s) for ^: 'type' and 'ABCMeta' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 3 failed, 11 passed, 22 warnings in 19.55s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2287"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2287_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2287_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2287_1"><button class="btn btn-outline-success"><span class="job_id">2287 : Job ID 74803f4635eb4f7c90a9ec4e61992f4e</span></button></div></a><div aria-labelledby="job_list___sub_heading_2287_1" data-parent="#job_list___sub_accordion_2287" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2287_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=163" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (163, 26), end pos: (163, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -160,7 +160,7 @@ pdf: PdfSource, secret: str, key: str, - intended_for: str | None = None, + intended_for: str ^ None = None, position: str | None = None, ) -&gt; bytes: """Return a new PDF with an embedded watermark.</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T030801938030Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T030802900414Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.67s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2288"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2288_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2288_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2288_1"><button class="btn btn-outline-danger"><span class="job_id">2288 : Job ID b64587cae7fd481a83bae891e8071816</span></button></div></a><div aria-labelledby="job_list___sub_heading_2288_1" data-parent="#job_list___sub_accordion_2288" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2288_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=164" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (164, 22), end pos: (164, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -161,7 +161,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str ^ None = None, ) -&gt; bytes: """Return a new PDF with an embedded watermark. </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.77s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2289"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2289_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2289_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2289_1"><button class="btn btn-outline-success"><span class="job_id">2289 : Job ID 250007fa495c42d6840aeea92b99ca26</span></button></div></a><div aria-labelledby="job_list___sub_heading_2289_1" data-parent="#job_list___sub_accordion_2289" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2289_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=203" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (203, 22), end pos: (203, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -200,7 +200,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str ^ None = None, ) -&gt; bool: """Return whether the method is applicable on this specific method </pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T155322141026Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T155323073301Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.27s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2290"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2290_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2290_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2290_1"><button class="btn btn-outline-success"><span class="job_id">2290 : Job ID 8b6b391150ef4753b2d935760a6f75e3</span></button></div></a><div aria-labelledby="job_list___sub_heading_2290_1" data-parent="#job_list___sub_accordion_2290" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2290_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=109" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (109, 7), end pos: (109, 10)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -106,7 +106,7 @@ else: raise TypeError("Unsupported PdfSource; expected bytes, path, or binary IO") - if not is_pdf_bytes(data): + if is_pdf_bytes(data): raise ValueError("Input does not look like a valid PDF (missing %PDF header)") return data </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T235402872722Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T235403748359Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ERROR server:rmap_handler.py:245 Failed to add source PDF to database: No users exist to own RMAP base document; create a user first ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 11 failed, 3 passed, 22 warnings in 19.38s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2291"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2291_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2291_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2291_1"><button class="btn btn-outline-success"><span class="job_id">2291 : Job ID ec080bddf93048b7930a0a7a1cddf504</span></button></div></a><div aria-labelledby="job_list___sub_heading_2291_1" data-parent="#job_list___sub_accordion_2291" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2291_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=98" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (98, 7), end pos: (98, 41)</button></a></pre><pre>operator: core/AddNot, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -95,7 +95,7 @@ ValueError If the resolved bytes do not appear to be a PDF file. """ - if isinstance(src, bytes | bytearray): + if not isinstance(src, bytes | bytearray): data = bytes(src) elif isinstance(src, str | os.PathLike): with open(os.fspath(src), "rb") as fh:</pre></div><div class="alert alert-secondary"><pre class="diff">.........FF..F [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 47 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 52 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:400: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1226 Error when attempting to read watermark for document 2: string argument without an encoding _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 3 failed, 11 passed, 22 warnings in 20.06s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2292"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2292_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2292_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2292_1"><button class="btn btn-outline-success"><span class="job_id">2292 : Job ID f678775a256f4c36956e4287e7a689d8</span></button></div></a><div aria-labelledby="job_list___sub_heading_2292_1" data-parent="#job_list___sub_accordion_2292" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2292_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=109" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (109, 7), end pos: (109, 29)</button></a></pre><pre>operator: core/AddNot, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -106,7 +106,7 @@ else: raise TypeError("Unsupported PdfSource; expected bytes, path, or binary IO") - if not is_pdf_bytes(data): + if not not is_pdf_bytes(data): raise ValueError("Input does not look like a valid PDF (missing %PDF header)") return data </pre></div><div class="alert alert-secondary"><pre class="diff">.........FF..F [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 47 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 52 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:400: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1226 Error when attempting to read watermark for document 2: Input does not look like a valid PDF (missing %PDF header) _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 3 failed, 11 passed, 22 warnings in 19.65s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2293"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2293_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2293_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2293_1"><button class="btn btn-outline-danger"><span class="job_id">2293 : Job ID ff8d058159d44e0e90c83c069cb3306a</span></button></div></a><div aria-labelledby="job_list___sub_heading_2293_1" data-parent="#job_list___sub_accordion_2293" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2293_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=142" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (142, 4), end pos: (143, 0)</button></a></pre><pre>operator: core/RemoveDecorator, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -138,8 +138,6 @@ #: Concrete implementations should override this with a short name #: (e.g., "toy-eof", "xmp-metadata", "object-stream"). name: ClassVar[str] = "abstract" - - @staticmethod @abstractmethod def get_usage() -&gt; str: """Return a a string containing a description of the expected usage.</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.18s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2294"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2294_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2294_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2294_1"><button class="btn btn-outline-danger"><span class="job_id">2294 : Job ID ae296c885ac441cfb053c7f8e3c2567f</span></button></div></a><div aria-labelledby="job_list___sub_heading_2294_1" data-parent="#job_list___sub_accordion_2294" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2294_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=143" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (143, 4), end pos: (144, 0)</button></a></pre><pre>operator: core/RemoveDecorator, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -140,7 +140,6 @@ name: ClassVar[str] = "abstract" @staticmethod - @abstractmethod def get_usage() -&gt; str: """Return a a string containing a description of the expected usage. </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.07s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2295"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2295_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2295_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2295_1"><button class="btn btn-outline-danger"><span class="job_id">2295 : Job ID a1ea6b0983e74634a57cdf1e416965aa</span></button></div></a><div aria-labelledby="job_list___sub_heading_2295_1" data-parent="#job_list___sub_accordion_2295" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2295_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=157" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (157, 4), end pos: (158, 0)</button></a></pre><pre>operator: core/RemoveDecorator, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -153,8 +153,6 @@ Usage description. """ raise NotImplementedError - - @abstractmethod def add_watermark( self, pdf: PdfSource,</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.70s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2296"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2296_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2296_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2296_1"><button class="btn btn-outline-danger"><span class="job_id">2296 : Job ID 59d1f46b844f400f9843e054645a711a</span></button></div></a><div aria-labelledby="job_list___sub_heading_2296_1" data-parent="#job_list___sub_accordion_2296" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2296_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=199" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (199, 4), end pos: (200, 0)</button></a></pre><pre>operator: core/RemoveDecorator, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -195,8 +195,6 @@ If inputs are invalid (e.g., not a PDF or empty secret). """ raise NotImplementedError - - @abstractmethod def is_watermark_applicable( self, pdf: PdfSource,</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.46s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2297"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2297_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2297_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2297_1"><button class="btn btn-outline-success"><span class="job_id">2297 : Job ID f2cafc68761d45a6854da9c7960fe9fd</span></button></div></a><div aria-labelledby="job_list___sub_heading_2297_1" data-parent="#job_list___sub_accordion_2297" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2297_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=watermarking_method.py&amp;line=233" class="text-secondary"><button class="btn btn-outline-dark">watermarking_method.py, start pos: (233, 4), end pos: (234, 0)</button></a></pre><pre>operator: core/RemoveDecorator, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- awatermarking_method.py +++ bwatermarking_method.py @@ -229,8 +229,6 @@ If inputs are invalid (e.g., not a PDF or empty secret). """ raise NotImplementedError - - @abstractmethod def read_secret(self, pdf: PdfSource, key: str) -&gt; str: """Extract and return the embedded secret from ``pdf``. </pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e63fc3c6e4198db91: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 20.96s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2298"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2298_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2298_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2298_1"><button class="btn btn-outline-success"><span class="job_id">2298 : Job ID e1809b80ea934433a95f7b4dc5aafb18</span></button></div></a><div aria-labelledby="job_list___sub_heading_2298_1" data-parent="#job_list___sub_accordion_2298" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2298_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=102" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (102, 35), end pos: (102, 36)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Sub, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -99,7 +99,7 @@ if not intended_for: raise ValueError("Missing recipient. (intended_for)") visibly_watermarked = self.visible_watermark( - data, "Intended for: " + intended_for + "\nDo not disclose" + data, "Intended for: " - intended_for + "\nDo not disclose" ) if not secret:</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("id"), int) assert isinstance(data.get("documentid"), int) assert isinstance(data.get("link"), str) assert isinstance(data.get("intended_for"), str) assert isinstance(data.get("method"), str) assert isinstance(data.get("position"), str) assert isinstance(data.get("filename"), str) assert isinstance(data.get("size"), int) #check values assert data.get("documentid") == parameters["id"] assert data.get("intended_for") == parameters["intended_for"] assert data.get("method") == parameters["method"] assert data.get("position") == parameters["position"] #Tests with wrong parameters #Test with exact same call: should return database insertion error (Non unique entry) resp = client.post("/api/create-watermark", json=parameters) assert resp.status_code == 503 #Non existant method resp = client.post("/api/create-watermark", json={"method": "watermarkmethod", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Non existant document resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 8}) assert resp.status_code == 404 #Missing id resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"}) assert resp.status_code == 400 #Missing method resp = client.post("/api/create-watermark", json={"position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Missing position: no issue if method ignores # (NB: must change intended_for or secret etc! Else integrity error.) resp = client.post("/api/create-watermark", json={"method": "overlay-watermark", "key": "key", "secret": "secret", "intended_for":"John", "id": 1}) &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:363: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1097 Integrity error during version insert for document 1: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b' for key 'uq_Versions_link'") [SQL: INSERT INTO Versions (documentid, link, intended_for, secret, method, position, path) VALUES (%(documentid)s, %(link)s, %(intended_for)s, %(secret)s, %(method)s, %(position)s, %(path)s) ] [parameters: {'documentid': 1, 'link': 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b', 'intended_for': 'Mickey Mouse', 'secret': 'secret', 'method': 'robust-xmp', 'position': 'metadata-only', 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username\\watermarks\\My File__Mickey_Mouse.pdf'}] (Background on this error at: https://sqlalche.me/e/20/gkpj) ERROR server:server.py:1007 Watermark applicability check failed for document 1: "Unknown watermarking method: 'watermarkmethod'. Known: ['overlay-watermark', 'robust-xmp', 'signed-annots']" WARNING server:server.py:972 Document not found or access denied for watermarking id=8 WARNING server:server.py:934 Missing document id in request WARNING server:server.py:948 Missing required fields for watermarking: {'id': 1, 'intended_for': 'Mickey Mouse', 'key': 'key', 'position': 'metadata-only', 'secret': 'secret'} ERROR server:server.py:1034 Watermarking failed for document 1 using method overlay-watermark: unsupported operand type(s) for -: 'str' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 1 failed, 13 passed, 22 warnings in 20.79s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2299"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2299_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2299_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2299_1"><button class="btn btn-outline-success"><span class="job_id">2299 : Job ID 51ef033a3ff34af88894e205af702072</span></button></div></a><div aria-labelledby="job_list___sub_heading_2299_1" data-parent="#job_list___sub_accordion_2299" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2299_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=102" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (102, 50), end pos: (102, 51)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Sub, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -99,7 +99,7 @@ if not intended_for: raise ValueError("Missing recipient. (intended_for)") visibly_watermarked = self.visible_watermark( - data, "Intended for: " + intended_for + "\nDo not disclose" + data, "Intended for: " + intended_for - "\nDo not disclose" ) if not secret:</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("id"), int) assert isinstance(data.get("documentid"), int) assert isinstance(data.get("link"), str) assert isinstance(data.get("intended_for"), str) assert isinstance(data.get("method"), str) assert isinstance(data.get("position"), str) assert isinstance(data.get("filename"), str) assert isinstance(data.get("size"), int) #check values assert data.get("documentid") == parameters["id"] assert data.get("intended_for") == parameters["intended_for"] assert data.get("method") == parameters["method"] assert data.get("position") == parameters["position"] #Tests with wrong parameters #Test with exact same call: should return database insertion error (Non unique entry) resp = client.post("/api/create-watermark", json=parameters) assert resp.status_code == 503 #Non existant method resp = client.post("/api/create-watermark", json={"method": "watermarkmethod", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Non existant document resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 8}) assert resp.status_code == 404 #Missing id resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"}) assert resp.status_code == 400 #Missing method resp = client.post("/api/create-watermark", json={"position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Missing position: no issue if method ignores # (NB: must change intended_for or secret etc! Else integrity error.) resp = client.post("/api/create-watermark", json={"method": "overlay-watermark", "key": "key", "secret": "secret", "intended_for":"John", "id": 1}) &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:363: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1097 Integrity error during version insert for document 1: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b' for key 'uq_Versions_link'") [SQL: INSERT INTO Versions (documentid, link, intended_for, secret, method, position, path) VALUES (%(documentid)s, %(link)s, %(intended_for)s, %(secret)s, %(method)s, %(position)s, %(path)s) ] [parameters: {'documentid': 1, 'link': 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b', 'intended_for': 'Mickey Mouse', 'secret': 'secret', 'method': 'robust-xmp', 'position': 'metadata-only', 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username\\watermarks\\My File__Mickey_Mouse.pdf'}] (Background on this error at: https://sqlalche.me/e/20/gkpj) ERROR server:server.py:1007 Watermark applicability check failed for document 1: "Unknown watermarking method: 'watermarkmethod'. Known: ['overlay-watermark', 'robust-xmp', 'signed-annots']" WARNING server:server.py:972 Document not found or access denied for watermarking id=8 WARNING server:server.py:934 Missing document id in request WARNING server:server.py:948 Missing required fields for watermarking: {'id': 1, 'intended_for': 'Mickey Mouse', 'key': 'key', 'position': 'metadata-only', 'secret': 'secret'} ERROR server:server.py:1034 Watermarking failed for document 1 using method overlay-watermark: unsupported operand type(s) for -: 'str' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 1 failed, 13 passed, 22 warnings in 21.06s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2300"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2300_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2300_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2300_1"><button class="btn btn-outline-success"><span class="job_id">2300 : Job ID a519e4229a6b4622809fd636a3917f78</span></button></div></a><div aria-labelledby="job_list___sub_heading_2300_1" data-parent="#job_list___sub_accordion_2300" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2300_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=102" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (102, 35), end pos: (102, 36)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Mul, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -99,7 +99,7 @@ if not intended_for: raise ValueError("Missing recipient. (intended_for)") visibly_watermarked = self.visible_watermark( - data, "Intended for: " + intended_for + "\nDo not disclose" + data, "Intended for: " * intended_for + "\nDo not disclose" ) if not secret:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T025230158916Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T025231049205Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.01s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2301"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2301_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2301_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2301_1"><button class="btn btn-outline-success"><span class="job_id">2301 : Job ID b4e40dc9202f4ca78da836a284e9b9f3</span></button></div></a><div aria-labelledby="job_list___sub_heading_2301_1" data-parent="#job_list___sub_accordion_2301" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2301_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=102" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (102, 50), end pos: (102, 51)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Mul, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -99,7 +99,7 @@ if not intended_for: raise ValueError("Missing recipient. (intended_for)") visibly_watermarked = self.visible_watermark( - data, "Intended for: " + intended_for + "\nDo not disclose" + data, "Intended for: " + intended_for * "\nDo not disclose" ) if not secret:</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("id"), int) assert isinstance(data.get("documentid"), int) assert isinstance(data.get("link"), str) assert isinstance(data.get("intended_for"), str) assert isinstance(data.get("method"), str) assert isinstance(data.get("position"), str) assert isinstance(data.get("filename"), str) assert isinstance(data.get("size"), int) #check values assert data.get("documentid") == parameters["id"] assert data.get("intended_for") == parameters["intended_for"] assert data.get("method") == parameters["method"] assert data.get("position") == parameters["position"] #Tests with wrong parameters #Test with exact same call: should return database insertion error (Non unique entry) resp = client.post("/api/create-watermark", json=parameters) assert resp.status_code == 503 #Non existant method resp = client.post("/api/create-watermark", json={"method": "watermarkmethod", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Non existant document resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 8}) assert resp.status_code == 404 #Missing id resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"}) assert resp.status_code == 400 #Missing method resp = client.post("/api/create-watermark", json={"position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Missing position: no issue if method ignores # (NB: must change intended_for or secret etc! Else integrity error.) resp = client.post("/api/create-watermark", json={"method": "overlay-watermark", "key": "key", "secret": "secret", "intended_for":"John", "id": 1}) &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:363: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1097 Integrity error during version insert for document 1: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b' for key 'uq_Versions_link'") [SQL: INSERT INTO Versions (documentid, link, intended_for, secret, method, position, path) VALUES (%(documentid)s, %(link)s, %(intended_for)s, %(secret)s, %(method)s, %(position)s, %(path)s) ] [parameters: {'documentid': 1, 'link': 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b', 'intended_for': 'Mickey Mouse', 'secret': 'secret', 'method': 'robust-xmp', 'position': 'metadata-only', 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username\\watermarks\\My File__Mickey_Mouse.pdf'}] (Background on this error at: https://sqlalche.me/e/20/gkpj) ERROR server:server.py:1007 Watermark applicability check failed for document 1: "Unknown watermarking method: 'watermarkmethod'. Known: ['overlay-watermark', 'robust-xmp', 'signed-annots']" WARNING server:server.py:972 Document not found or access denied for watermarking id=8 WARNING server:server.py:934 Missing document id in request WARNING server:server.py:948 Missing required fields for watermarking: {'id': 1, 'intended_for': 'Mickey Mouse', 'key': 'key', 'position': 'metadata-only', 'secret': 'secret'} ERROR server:server.py:1034 Watermarking failed for document 1 using method overlay-watermark: can't multiply sequence by non-int of type 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 1 failed, 13 passed, 22 warnings in 20.42s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2302"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2302_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2302_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2302_1"><button class="btn btn-outline-success"><span class="job_id">2302 : Job ID 8555075f9a214e82a26388d59388f2f1</span></button></div></a><div aria-labelledby="job_list___sub_heading_2302_1" data-parent="#job_list___sub_accordion_2302" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2302_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=102" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (102, 35), end pos: (102, 36)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Div, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -99,7 +99,7 @@ if not intended_for: raise ValueError("Missing recipient. (intended_for)") visibly_watermarked = self.visible_watermark( - data, "Intended for: " + intended_for + "\nDo not disclose" + data, "Intended for: " / intended_for + "\nDo not disclose" ) if not secret:</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("id"), int) assert isinstance(data.get("documentid"), int) assert isinstance(data.get("link"), str) assert isinstance(data.get("intended_for"), str) assert isinstance(data.get("method"), str) assert isinstance(data.get("position"), str) assert isinstance(data.get("filename"), str) assert isinstance(data.get("size"), int) #check values assert data.get("documentid") == parameters["id"] assert data.get("intended_for") == parameters["intended_for"] assert data.get("method") == parameters["method"] assert data.get("position") == parameters["position"] #Tests with wrong parameters #Test with exact same call: should return database insertion error (Non unique entry) resp = client.post("/api/create-watermark", json=parameters) assert resp.status_code == 503 #Non existant method resp = client.post("/api/create-watermark", json={"method": "watermarkmethod", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Non existant document resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 8}) assert resp.status_code == 404 #Missing id resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"}) assert resp.status_code == 400 #Missing method resp = client.post("/api/create-watermark", json={"position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Missing position: no issue if method ignores # (NB: must change intended_for or secret etc! Else integrity error.) resp = client.post("/api/create-watermark", json={"method": "overlay-watermark", "key": "key", "secret": "secret", "intended_for":"John", "id": 1}) &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:363: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1097 Integrity error during version insert for document 1: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b' for key 'uq_Versions_link'") [SQL: INSERT INTO Versions (documentid, link, intended_for, secret, method, position, path) VALUES (%(documentid)s, %(link)s, %(intended_for)s, %(secret)s, %(method)s, %(position)s, %(path)s) ] [parameters: {'documentid': 1, 'link': 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b', 'intended_for': 'Mickey Mouse', 'secret': 'secret', 'method': 'robust-xmp', 'position': 'metadata-only', 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username\\watermarks\\My File__Mickey_Mouse.pdf'}] (Background on this error at: https://sqlalche.me/e/20/gkpj) ERROR server:server.py:1007 Watermark applicability check failed for document 1: "Unknown watermarking method: 'watermarkmethod'. Known: ['overlay-watermark', 'robust-xmp', 'signed-annots']" WARNING server:server.py:972 Document not found or access denied for watermarking id=8 WARNING server:server.py:934 Missing document id in request WARNING server:server.py:948 Missing required fields for watermarking: {'id': 1, 'intended_for': 'Mickey Mouse', 'key': 'key', 'position': 'metadata-only', 'secret': 'secret'} ERROR server:server.py:1034 Watermarking failed for document 1 using method overlay-watermark: unsupported operand type(s) for /: 'str' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 1 failed, 13 passed, 22 warnings in 20.77s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2303"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2303_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2303_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2303_1"><button class="btn btn-outline-success"><span class="job_id">2303 : Job ID 7d52f1cfe6174249b8ce075f54122302</span></button></div></a><div aria-labelledby="job_list___sub_heading_2303_1" data-parent="#job_list___sub_accordion_2303" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2303_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=102" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (102, 50), end pos: (102, 51)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Div, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -99,7 +99,7 @@ if not intended_for: raise ValueError("Missing recipient. (intended_for)") visibly_watermarked = self.visible_watermark( - data, "Intended for: " + intended_for + "\nDo not disclose" + data, "Intended for: " + intended_for / "\nDo not disclose" ) if not secret:</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("id"), int) assert isinstance(data.get("documentid"), int) assert isinstance(data.get("link"), str) assert isinstance(data.get("intended_for"), str) assert isinstance(data.get("method"), str) assert isinstance(data.get("position"), str) assert isinstance(data.get("filename"), str) assert isinstance(data.get("size"), int) #check values assert data.get("documentid") == parameters["id"] assert data.get("intended_for") == parameters["intended_for"] assert data.get("method") == parameters["method"] assert data.get("position") == parameters["position"] #Tests with wrong parameters #Test with exact same call: should return database insertion error (Non unique entry) resp = client.post("/api/create-watermark", json=parameters) assert resp.status_code == 503 #Non existant method resp = client.post("/api/create-watermark", json={"method": "watermarkmethod", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Non existant document resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 8}) assert resp.status_code == 404 #Missing id resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"}) assert resp.status_code == 400 #Missing method resp = client.post("/api/create-watermark", json={"position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Missing position: no issue if method ignores # (NB: must change intended_for or secret etc! Else integrity error.) resp = client.post("/api/create-watermark", json={"method": "overlay-watermark", "key": "key", "secret": "secret", "intended_for":"John", "id": 1}) &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:363: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1097 Integrity error during version insert for document 1: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b' for key 'uq_Versions_link'") [SQL: INSERT INTO Versions (documentid, link, intended_for, secret, method, position, path) VALUES (%(documentid)s, %(link)s, %(intended_for)s, %(secret)s, %(method)s, %(position)s, %(path)s) ] [parameters: {'documentid': 1, 'link': 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b', 'intended_for': 'Mickey Mouse', 'secret': 'secret', 'method': 'robust-xmp', 'position': 'metadata-only', 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username\\watermarks\\My File__Mickey_Mouse.pdf'}] (Background on this error at: https://sqlalche.me/e/20/gkpj) ERROR server:server.py:1007 Watermark applicability check failed for document 1: "Unknown watermarking method: 'watermarkmethod'. Known: ['overlay-watermark', 'robust-xmp', 'signed-annots']" WARNING server:server.py:972 Document not found or access denied for watermarking id=8 WARNING server:server.py:934 Missing document id in request WARNING server:server.py:948 Missing required fields for watermarking: {'id': 1, 'intended_for': 'Mickey Mouse', 'key': 'key', 'position': 'metadata-only', 'secret': 'secret'} ERROR server:server.py:1034 Watermarking failed for document 1 using method overlay-watermark: unsupported operand type(s) for /: 'str' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 1 failed, 13 passed, 22 warnings in 20.47s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2304"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2304_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2304_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2304_1"><button class="btn btn-outline-success"><span class="job_id">2304 : Job ID 1d49fb9315274e158982c2c8cef21245</span></button></div></a><div aria-labelledby="job_list___sub_heading_2304_1" data-parent="#job_list___sub_accordion_2304" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2304_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=102" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (102, 35), end pos: (102, 36)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_FloorDiv, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -99,7 +99,7 @@ if not intended_for: raise ValueError("Missing recipient. (intended_for)") visibly_watermarked = self.visible_watermark( - data, "Intended for: " + intended_for + "\nDo not disclose" + data, "Intended for: " // intended_for + "\nDo not disclose" ) if not secret:</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("id"), int) assert isinstance(data.get("documentid"), int) assert isinstance(data.get("link"), str) assert isinstance(data.get("intended_for"), str) assert isinstance(data.get("method"), str) assert isinstance(data.get("position"), str) assert isinstance(data.get("filename"), str) assert isinstance(data.get("size"), int) #check values assert data.get("documentid") == parameters["id"] assert data.get("intended_for") == parameters["intended_for"] assert data.get("method") == parameters["method"] assert data.get("position") == parameters["position"] #Tests with wrong parameters #Test with exact same call: should return database insertion error (Non unique entry) resp = client.post("/api/create-watermark", json=parameters) assert resp.status_code == 503 #Non existant method resp = client.post("/api/create-watermark", json={"method": "watermarkmethod", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Non existant document resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 8}) assert resp.status_code == 404 #Missing id resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"}) assert resp.status_code == 400 #Missing method resp = client.post("/api/create-watermark", json={"position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Missing position: no issue if method ignores # (NB: must change intended_for or secret etc! Else integrity error.) resp = client.post("/api/create-watermark", json={"method": "overlay-watermark", "key": "key", "secret": "secret", "intended_for":"John", "id": 1}) &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:363: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1097 Integrity error during version insert for document 1: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b' for key 'uq_Versions_link'") [SQL: INSERT INTO Versions (documentid, link, intended_for, secret, method, position, path) VALUES (%(documentid)s, %(link)s, %(intended_for)s, %(secret)s, %(method)s, %(position)s, %(path)s) ] [parameters: {'documentid': 1, 'link': 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b', 'intended_for': 'Mickey Mouse', 'secret': 'secret', 'method': 'robust-xmp', 'position': 'metadata-only', 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username\\watermarks\\My File__Mickey_Mouse.pdf'}] (Background on this error at: https://sqlalche.me/e/20/gkpj) ERROR server:server.py:1007 Watermark applicability check failed for document 1: "Unknown watermarking method: 'watermarkmethod'. Known: ['overlay-watermark', 'robust-xmp', 'signed-annots']" WARNING server:server.py:972 Document not found or access denied for watermarking id=8 WARNING server:server.py:934 Missing document id in request WARNING server:server.py:948 Missing required fields for watermarking: {'id': 1, 'intended_for': 'Mickey Mouse', 'key': 'key', 'position': 'metadata-only', 'secret': 'secret'} ERROR server:server.py:1034 Watermarking failed for document 1 using method overlay-watermark: unsupported operand type(s) for //: 'str' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 1 failed, 13 passed, 22 warnings in 20.69s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2305"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2305_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2305_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2305_1"><button class="btn btn-outline-success"><span class="job_id">2305 : Job ID 27c131bdf6ea4082bd823189893e5209</span></button></div></a><div aria-labelledby="job_list___sub_heading_2305_1" data-parent="#job_list___sub_accordion_2305" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2305_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=102" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (102, 50), end pos: (102, 51)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_FloorDiv, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -99,7 +99,7 @@ if not intended_for: raise ValueError("Missing recipient. (intended_for)") visibly_watermarked = self.visible_watermark( - data, "Intended for: " + intended_for + "\nDo not disclose" + data, "Intended for: " + intended_for // "\nDo not disclose" ) if not secret:</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("id"), int) assert isinstance(data.get("documentid"), int) assert isinstance(data.get("link"), str) assert isinstance(data.get("intended_for"), str) assert isinstance(data.get("method"), str) assert isinstance(data.get("position"), str) assert isinstance(data.get("filename"), str) assert isinstance(data.get("size"), int) #check values assert data.get("documentid") == parameters["id"] assert data.get("intended_for") == parameters["intended_for"] assert data.get("method") == parameters["method"] assert data.get("position") == parameters["position"] #Tests with wrong parameters #Test with exact same call: should return database insertion error (Non unique entry) resp = client.post("/api/create-watermark", json=parameters) assert resp.status_code == 503 #Non existant method resp = client.post("/api/create-watermark", json={"method": "watermarkmethod", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Non existant document resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 8}) assert resp.status_code == 404 #Missing id resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"}) assert resp.status_code == 400 #Missing method resp = client.post("/api/create-watermark", json={"position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Missing position: no issue if method ignores # (NB: must change intended_for or secret etc! Else integrity error.) resp = client.post("/api/create-watermark", json={"method": "overlay-watermark", "key": "key", "secret": "secret", "intended_for":"John", "id": 1}) &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:363: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1097 Integrity error during version insert for document 1: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b' for key 'uq_Versions_link'") [SQL: INSERT INTO Versions (documentid, link, intended_for, secret, method, position, path) VALUES (%(documentid)s, %(link)s, %(intended_for)s, %(secret)s, %(method)s, %(position)s, %(path)s) ] [parameters: {'documentid': 1, 'link': 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b', 'intended_for': 'Mickey Mouse', 'secret': 'secret', 'method': 'robust-xmp', 'position': 'metadata-only', 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username\\watermarks\\My File__Mickey_Mouse.pdf'}] (Background on this error at: https://sqlalche.me/e/20/gkpj) ERROR server:server.py:1007 Watermark applicability check failed for document 1: "Unknown watermarking method: 'watermarkmethod'. Known: ['overlay-watermark', 'robust-xmp', 'signed-annots']" WARNING server:server.py:972 Document not found or access denied for watermarking id=8 WARNING server:server.py:934 Missing document id in request WARNING server:server.py:948 Missing required fields for watermarking: {'id': 1, 'intended_for': 'Mickey Mouse', 'key': 'key', 'position': 'metadata-only', 'secret': 'secret'} ERROR server:server.py:1034 Watermarking failed for document 1 using method overlay-watermark: unsupported operand type(s) for //: 'str' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 1 failed, 13 passed, 22 warnings in 20.25s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2306"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2306_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2306_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2306_1"><button class="btn btn-outline-success"><span class="job_id">2306 : Job ID bbf0eedc3d5c4f9c9b83f8668c1ed3dd</span></button></div></a><div aria-labelledby="job_list___sub_heading_2306_1" data-parent="#job_list___sub_accordion_2306" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2306_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=102" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (102, 35), end pos: (102, 36)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Mod, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -99,7 +99,7 @@ if not intended_for: raise ValueError("Missing recipient. (intended_for)") visibly_watermarked = self.visible_watermark( - data, "Intended for: " + intended_for + "\nDo not disclose" + data, "Intended for: " % intended_for + "\nDo not disclose" ) if not secret:</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("id"), int) assert isinstance(data.get("documentid"), int) assert isinstance(data.get("link"), str) assert isinstance(data.get("intended_for"), str) assert isinstance(data.get("method"), str) assert isinstance(data.get("position"), str) assert isinstance(data.get("filename"), str) assert isinstance(data.get("size"), int) #check values assert data.get("documentid") == parameters["id"] assert data.get("intended_for") == parameters["intended_for"] assert data.get("method") == parameters["method"] assert data.get("position") == parameters["position"] #Tests with wrong parameters #Test with exact same call: should return database insertion error (Non unique entry) resp = client.post("/api/create-watermark", json=parameters) assert resp.status_code == 503 #Non existant method resp = client.post("/api/create-watermark", json={"method": "watermarkmethod", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Non existant document resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 8}) assert resp.status_code == 404 #Missing id resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"}) assert resp.status_code == 400 #Missing method resp = client.post("/api/create-watermark", json={"position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Missing position: no issue if method ignores # (NB: must change intended_for or secret etc! Else integrity error.) resp = client.post("/api/create-watermark", json={"method": "overlay-watermark", "key": "key", "secret": "secret", "intended_for":"John", "id": 1}) &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:363: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1097 Integrity error during version insert for document 1: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b' for key 'uq_Versions_link'") [SQL: INSERT INTO Versions (documentid, link, intended_for, secret, method, position, path) VALUES (%(documentid)s, %(link)s, %(intended_for)s, %(secret)s, %(method)s, %(position)s, %(path)s) ] [parameters: {'documentid': 1, 'link': 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b', 'intended_for': 'Mickey Mouse', 'secret': 'secret', 'method': 'robust-xmp', 'position': 'metadata-only', 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username\\watermarks\\My File__Mickey_Mouse.pdf'}] (Background on this error at: https://sqlalche.me/e/20/gkpj) ERROR server:server.py:1007 Watermark applicability check failed for document 1: "Unknown watermarking method: 'watermarkmethod'. Known: ['overlay-watermark', 'robust-xmp', 'signed-annots']" WARNING server:server.py:972 Document not found or access denied for watermarking id=8 WARNING server:server.py:934 Missing document id in request WARNING server:server.py:948 Missing required fields for watermarking: {'id': 1, 'intended_for': 'Mickey Mouse', 'key': 'key', 'position': 'metadata-only', 'secret': 'secret'} ERROR server:server.py:1034 Watermarking failed for document 1 using method overlay-watermark: not all arguments converted during string formatting ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 1 failed, 13 passed, 22 warnings in 20.63s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2307"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2307_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2307_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2307_1"><button class="btn btn-outline-success"><span class="job_id">2307 : Job ID 66f99fb192014842ad7837cd426c1d85</span></button></div></a><div aria-labelledby="job_list___sub_heading_2307_1" data-parent="#job_list___sub_accordion_2307" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2307_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=102" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (102, 50), end pos: (102, 51)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Mod, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -99,7 +99,7 @@ if not intended_for: raise ValueError("Missing recipient. (intended_for)") visibly_watermarked = self.visible_watermark( - data, "Intended for: " + intended_for + "\nDo not disclose" + data, "Intended for: " + intended_for % "\nDo not disclose" ) if not secret:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T004800572292Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T004801469515Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.40s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2308"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2308_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2308_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2308_1"><button class="btn btn-outline-success"><span class="job_id">2308 : Job ID 663f2f846ff64984a7555aae1724cd21</span></button></div></a><div aria-labelledby="job_list___sub_heading_2308_1" data-parent="#job_list___sub_accordion_2308" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2308_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=102" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (102, 35), end pos: (102, 36)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Pow, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -99,7 +99,7 @@ if not intended_for: raise ValueError("Missing recipient. (intended_for)") visibly_watermarked = self.visible_watermark( - data, "Intended for: " + intended_for + "\nDo not disclose" + data, "Intended for: " ** intended_for + "\nDo not disclose" ) if not secret:</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("id"), int) assert isinstance(data.get("documentid"), int) assert isinstance(data.get("link"), str) assert isinstance(data.get("intended_for"), str) assert isinstance(data.get("method"), str) assert isinstance(data.get("position"), str) assert isinstance(data.get("filename"), str) assert isinstance(data.get("size"), int) #check values assert data.get("documentid") == parameters["id"] assert data.get("intended_for") == parameters["intended_for"] assert data.get("method") == parameters["method"] assert data.get("position") == parameters["position"] #Tests with wrong parameters #Test with exact same call: should return database insertion error (Non unique entry) resp = client.post("/api/create-watermark", json=parameters) assert resp.status_code == 503 #Non existant method resp = client.post("/api/create-watermark", json={"method": "watermarkmethod", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Non existant document resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 8}) assert resp.status_code == 404 #Missing id resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"}) assert resp.status_code == 400 #Missing method resp = client.post("/api/create-watermark", json={"position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Missing position: no issue if method ignores # (NB: must change intended_for or secret etc! Else integrity error.) resp = client.post("/api/create-watermark", json={"method": "overlay-watermark", "key": "key", "secret": "secret", "intended_for":"John", "id": 1}) &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:363: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1097 Integrity error during version insert for document 1: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b' for key 'uq_Versions_link'") [SQL: INSERT INTO Versions (documentid, link, intended_for, secret, method, position, path) VALUES (%(documentid)s, %(link)s, %(intended_for)s, %(secret)s, %(method)s, %(position)s, %(path)s) ] [parameters: {'documentid': 1, 'link': 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b', 'intended_for': 'Mickey Mouse', 'secret': 'secret', 'method': 'robust-xmp', 'position': 'metadata-only', 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username\\watermarks\\My File__Mickey_Mouse.pdf'}] (Background on this error at: https://sqlalche.me/e/20/gkpj) ERROR server:server.py:1007 Watermark applicability check failed for document 1: "Unknown watermarking method: 'watermarkmethod'. Known: ['overlay-watermark', 'robust-xmp', 'signed-annots']" WARNING server:server.py:972 Document not found or access denied for watermarking id=8 WARNING server:server.py:934 Missing document id in request WARNING server:server.py:948 Missing required fields for watermarking: {'id': 1, 'intended_for': 'Mickey Mouse', 'key': 'key', 'position': 'metadata-only', 'secret': 'secret'} ERROR server:server.py:1034 Watermarking failed for document 1 using method overlay-watermark: unsupported operand type(s) for ** or pow(): 'str' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 1 failed, 13 passed, 22 warnings in 20.35s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2309"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2309_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2309_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2309_1"><button class="btn btn-outline-success"><span class="job_id">2309 : Job ID 87c8c647eaff4ba1b5543f8749d4c2b6</span></button></div></a><div aria-labelledby="job_list___sub_heading_2309_1" data-parent="#job_list___sub_accordion_2309" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2309_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=102" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (102, 50), end pos: (102, 51)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Pow, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -99,7 +99,7 @@ if not intended_for: raise ValueError("Missing recipient. (intended_for)") visibly_watermarked = self.visible_watermark( - data, "Intended for: " + intended_for + "\nDo not disclose" + data, "Intended for: " + intended_for ** "\nDo not disclose" ) if not secret:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T041646699048Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T041647729624Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 20.10s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2310"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2310_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2310_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2310_1"><button class="btn btn-outline-success"><span class="job_id">2310 : Job ID bbb6110b86e7473c8b4b7425130b27de</span></button></div></a><div aria-labelledby="job_list___sub_heading_2310_1" data-parent="#job_list___sub_accordion_2310" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2310_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=102" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (102, 35), end pos: (102, 36)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_RShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -99,7 +99,7 @@ if not intended_for: raise ValueError("Missing recipient. (intended_for)") visibly_watermarked = self.visible_watermark( - data, "Intended for: " + intended_for + "\nDo not disclose" + data, "Intended for: " &gt;&gt; intended_for + "\nDo not disclose" ) if not secret:</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("id"), int) assert isinstance(data.get("documentid"), int) assert isinstance(data.get("link"), str) assert isinstance(data.get("intended_for"), str) assert isinstance(data.get("method"), str) assert isinstance(data.get("position"), str) assert isinstance(data.get("filename"), str) assert isinstance(data.get("size"), int) #check values assert data.get("documentid") == parameters["id"] assert data.get("intended_for") == parameters["intended_for"] assert data.get("method") == parameters["method"] assert data.get("position") == parameters["position"] #Tests with wrong parameters #Test with exact same call: should return database insertion error (Non unique entry) resp = client.post("/api/create-watermark", json=parameters) assert resp.status_code == 503 #Non existant method resp = client.post("/api/create-watermark", json={"method": "watermarkmethod", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Non existant document resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 8}) assert resp.status_code == 404 #Missing id resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"}) assert resp.status_code == 400 #Missing method resp = client.post("/api/create-watermark", json={"position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Missing position: no issue if method ignores # (NB: must change intended_for or secret etc! Else integrity error.) resp = client.post("/api/create-watermark", json={"method": "overlay-watermark", "key": "key", "secret": "secret", "intended_for":"John", "id": 1}) &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:363: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1097 Integrity error during version insert for document 1: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b' for key 'uq_Versions_link'") [SQL: INSERT INTO Versions (documentid, link, intended_for, secret, method, position, path) VALUES (%(documentid)s, %(link)s, %(intended_for)s, %(secret)s, %(method)s, %(position)s, %(path)s) ] [parameters: {'documentid': 1, 'link': 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b', 'intended_for': 'Mickey Mouse', 'secret': 'secret', 'method': 'robust-xmp', 'position': 'metadata-only', 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username\\watermarks\\My File__Mickey_Mouse.pdf'}] (Background on this error at: https://sqlalche.me/e/20/gkpj) ERROR server:server.py:1007 Watermark applicability check failed for document 1: "Unknown watermarking method: 'watermarkmethod'. Known: ['overlay-watermark', 'robust-xmp', 'signed-annots']" WARNING server:server.py:972 Document not found or access denied for watermarking id=8 WARNING server:server.py:934 Missing document id in request WARNING server:server.py:948 Missing required fields for watermarking: {'id': 1, 'intended_for': 'Mickey Mouse', 'key': 'key', 'position': 'metadata-only', 'secret': 'secret'} ERROR server:server.py:1034 Watermarking failed for document 1 using method overlay-watermark: unsupported operand type(s) for &gt;&gt;: 'str' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 1 failed, 13 passed, 22 warnings in 20.44s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2311"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2311_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2311_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2311_1"><button class="btn btn-outline-success"><span class="job_id">2311 : Job ID 056fbacb8c3c47f7a9c39c1afb03c9d6</span></button></div></a><div aria-labelledby="job_list___sub_heading_2311_1" data-parent="#job_list___sub_accordion_2311" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2311_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=102" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (102, 50), end pos: (102, 51)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_RShift, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -99,7 +99,7 @@ if not intended_for: raise ValueError("Missing recipient. (intended_for)") visibly_watermarked = self.visible_watermark( - data, "Intended for: " + intended_for + "\nDo not disclose" + data, "Intended for: " + intended_for &gt;&gt; "\nDo not disclose" ) if not secret:</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("id"), int) assert isinstance(data.get("documentid"), int) assert isinstance(data.get("link"), str) assert isinstance(data.get("intended_for"), str) assert isinstance(data.get("method"), str) assert isinstance(data.get("position"), str) assert isinstance(data.get("filename"), str) assert isinstance(data.get("size"), int) #check values assert data.get("documentid") == parameters["id"] assert data.get("intended_for") == parameters["intended_for"] assert data.get("method") == parameters["method"] assert data.get("position") == parameters["position"] #Tests with wrong parameters #Test with exact same call: should return database insertion error (Non unique entry) resp = client.post("/api/create-watermark", json=parameters) assert resp.status_code == 503 #Non existant method resp = client.post("/api/create-watermark", json={"method": "watermarkmethod", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Non existant document resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 8}) assert resp.status_code == 404 #Missing id resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"}) assert resp.status_code == 400 #Missing method resp = client.post("/api/create-watermark", json={"position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Missing position: no issue if method ignores # (NB: must change intended_for or secret etc! Else integrity error.) resp = client.post("/api/create-watermark", json={"method": "overlay-watermark", "key": "key", "secret": "secret", "intended_for":"John", "id": 1}) &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:363: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1097 Integrity error during version insert for document 1: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b' for key 'uq_Versions_link'") [SQL: INSERT INTO Versions (documentid, link, intended_for, secret, method, position, path) VALUES (%(documentid)s, %(link)s, %(intended_for)s, %(secret)s, %(method)s, %(position)s, %(path)s) ] [parameters: {'documentid': 1, 'link': 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b', 'intended_for': 'Mickey Mouse', 'secret': 'secret', 'method': 'robust-xmp', 'position': 'metadata-only', 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username\\watermarks\\My File__Mickey_Mouse.pdf'}] (Background on this error at: https://sqlalche.me/e/20/gkpj) ERROR server:server.py:1007 Watermark applicability check failed for document 1: "Unknown watermarking method: 'watermarkmethod'. Known: ['overlay-watermark', 'robust-xmp', 'signed-annots']" WARNING server:server.py:972 Document not found or access denied for watermarking id=8 WARNING server:server.py:934 Missing document id in request WARNING server:server.py:948 Missing required fields for watermarking: {'id': 1, 'intended_for': 'Mickey Mouse', 'key': 'key', 'position': 'metadata-only', 'secret': 'secret'} ERROR server:server.py:1034 Watermarking failed for document 1 using method overlay-watermark: unsupported operand type(s) for &gt;&gt;: 'str' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 1 failed, 13 passed, 22 warnings in 20.10s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2312"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2312_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2312_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2312_1"><button class="btn btn-outline-success"><span class="job_id">2312 : Job ID b638f65c141b44c99b072144626573e5</span></button></div></a><div aria-labelledby="job_list___sub_heading_2312_1" data-parent="#job_list___sub_accordion_2312" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2312_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=102" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (102, 35), end pos: (102, 36)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_LShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -99,7 +99,7 @@ if not intended_for: raise ValueError("Missing recipient. (intended_for)") visibly_watermarked = self.visible_watermark( - data, "Intended for: " + intended_for + "\nDo not disclose" + data, "Intended for: " &lt;&lt; intended_for + "\nDo not disclose" ) if not secret:</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("id"), int) assert isinstance(data.get("documentid"), int) assert isinstance(data.get("link"), str) assert isinstance(data.get("intended_for"), str) assert isinstance(data.get("method"), str) assert isinstance(data.get("position"), str) assert isinstance(data.get("filename"), str) assert isinstance(data.get("size"), int) #check values assert data.get("documentid") == parameters["id"] assert data.get("intended_for") == parameters["intended_for"] assert data.get("method") == parameters["method"] assert data.get("position") == parameters["position"] #Tests with wrong parameters #Test with exact same call: should return database insertion error (Non unique entry) resp = client.post("/api/create-watermark", json=parameters) assert resp.status_code == 503 #Non existant method resp = client.post("/api/create-watermark", json={"method": "watermarkmethod", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Non existant document resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 8}) assert resp.status_code == 404 #Missing id resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"}) assert resp.status_code == 400 #Missing method resp = client.post("/api/create-watermark", json={"position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Missing position: no issue if method ignores # (NB: must change intended_for or secret etc! Else integrity error.) resp = client.post("/api/create-watermark", json={"method": "overlay-watermark", "key": "key", "secret": "secret", "intended_for":"John", "id": 1}) &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:363: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1097 Integrity error during version insert for document 1: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b' for key 'uq_Versions_link'") [SQL: INSERT INTO Versions (documentid, link, intended_for, secret, method, position, path) VALUES (%(documentid)s, %(link)s, %(intended_for)s, %(secret)s, %(method)s, %(position)s, %(path)s) ] [parameters: {'documentid': 1, 'link': 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b', 'intended_for': 'Mickey Mouse', 'secret': 'secret', 'method': 'robust-xmp', 'position': 'metadata-only', 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username\\watermarks\\My File__Mickey_Mouse.pdf'}] (Background on this error at: https://sqlalche.me/e/20/gkpj) ERROR server:server.py:1007 Watermark applicability check failed for document 1: "Unknown watermarking method: 'watermarkmethod'. Known: ['overlay-watermark', 'robust-xmp', 'signed-annots']" WARNING server:server.py:972 Document not found or access denied for watermarking id=8 WARNING server:server.py:934 Missing document id in request WARNING server:server.py:948 Missing required fields for watermarking: {'id': 1, 'intended_for': 'Mickey Mouse', 'key': 'key', 'position': 'metadata-only', 'secret': 'secret'} ERROR server:server.py:1034 Watermarking failed for document 1 using method overlay-watermark: unsupported operand type(s) for &lt;&lt;: 'str' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 1 failed, 13 passed, 22 warnings in 20.24s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2313"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2313_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2313_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2313_1"><button class="btn btn-outline-success"><span class="job_id">2313 : Job ID 48742a11d969439eb94e9c4d3c6fa180</span></button></div></a><div aria-labelledby="job_list___sub_heading_2313_1" data-parent="#job_list___sub_accordion_2313" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2313_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=102" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (102, 50), end pos: (102, 51)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_LShift, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -99,7 +99,7 @@ if not intended_for: raise ValueError("Missing recipient. (intended_for)") visibly_watermarked = self.visible_watermark( - data, "Intended for: " + intended_for + "\nDo not disclose" + data, "Intended for: " + intended_for &lt;&lt; "\nDo not disclose" ) if not secret:</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("id"), int) assert isinstance(data.get("documentid"), int) assert isinstance(data.get("link"), str) assert isinstance(data.get("intended_for"), str) assert isinstance(data.get("method"), str) assert isinstance(data.get("position"), str) assert isinstance(data.get("filename"), str) assert isinstance(data.get("size"), int) #check values assert data.get("documentid") == parameters["id"] assert data.get("intended_for") == parameters["intended_for"] assert data.get("method") == parameters["method"] assert data.get("position") == parameters["position"] #Tests with wrong parameters #Test with exact same call: should return database insertion error (Non unique entry) resp = client.post("/api/create-watermark", json=parameters) assert resp.status_code == 503 #Non existant method resp = client.post("/api/create-watermark", json={"method": "watermarkmethod", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Non existant document resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 8}) assert resp.status_code == 404 #Missing id resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"}) assert resp.status_code == 400 #Missing method resp = client.post("/api/create-watermark", json={"position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Missing position: no issue if method ignores # (NB: must change intended_for or secret etc! Else integrity error.) resp = client.post("/api/create-watermark", json={"method": "overlay-watermark", "key": "key", "secret": "secret", "intended_for":"John", "id": 1}) &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:363: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1097 Integrity error during version insert for document 1: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b' for key 'uq_Versions_link'") [SQL: INSERT INTO Versions (documentid, link, intended_for, secret, method, position, path) VALUES (%(documentid)s, %(link)s, %(intended_for)s, %(secret)s, %(method)s, %(position)s, %(path)s) ] [parameters: {'documentid': 1, 'link': 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b', 'intended_for': 'Mickey Mouse', 'secret': 'secret', 'method': 'robust-xmp', 'position': 'metadata-only', 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username\\watermarks\\My File__Mickey_Mouse.pdf'}] (Background on this error at: https://sqlalche.me/e/20/gkpj) ERROR server:server.py:1007 Watermark applicability check failed for document 1: "Unknown watermarking method: 'watermarkmethod'. Known: ['overlay-watermark', 'robust-xmp', 'signed-annots']" WARNING server:server.py:972 Document not found or access denied for watermarking id=8 WARNING server:server.py:934 Missing document id in request WARNING server:server.py:948 Missing required fields for watermarking: {'id': 1, 'intended_for': 'Mickey Mouse', 'key': 'key', 'position': 'metadata-only', 'secret': 'secret'} ERROR server:server.py:1034 Watermarking failed for document 1 using method overlay-watermark: unsupported operand type(s) for &lt;&lt;: 'str' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 1 failed, 13 passed, 22 warnings in 20.24s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2314"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2314_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2314_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2314_1"><button class="btn btn-outline-success"><span class="job_id">2314 : Job ID 3a648343c6c74d5ba8cde734014b2bb3</span></button></div></a><div aria-labelledby="job_list___sub_heading_2314_1" data-parent="#job_list___sub_accordion_2314" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2314_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=102" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (102, 35), end pos: (102, 36)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitOr, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -99,7 +99,7 @@ if not intended_for: raise ValueError("Missing recipient. (intended_for)") visibly_watermarked = self.visible_watermark( - data, "Intended for: " + intended_for + "\nDo not disclose" + data, "Intended for: " | intended_for + "\nDo not disclose" ) if not secret:</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("id"), int) assert isinstance(data.get("documentid"), int) assert isinstance(data.get("link"), str) assert isinstance(data.get("intended_for"), str) assert isinstance(data.get("method"), str) assert isinstance(data.get("position"), str) assert isinstance(data.get("filename"), str) assert isinstance(data.get("size"), int) #check values assert data.get("documentid") == parameters["id"] assert data.get("intended_for") == parameters["intended_for"] assert data.get("method") == parameters["method"] assert data.get("position") == parameters["position"] #Tests with wrong parameters #Test with exact same call: should return database insertion error (Non unique entry) resp = client.post("/api/create-watermark", json=parameters) assert resp.status_code == 503 #Non existant method resp = client.post("/api/create-watermark", json={"method": "watermarkmethod", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Non existant document resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 8}) assert resp.status_code == 404 #Missing id resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"}) assert resp.status_code == 400 #Missing method resp = client.post("/api/create-watermark", json={"position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Missing position: no issue if method ignores # (NB: must change intended_for or secret etc! Else integrity error.) resp = client.post("/api/create-watermark", json={"method": "overlay-watermark", "key": "key", "secret": "secret", "intended_for":"John", "id": 1}) &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:363: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1097 Integrity error during version insert for document 1: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b' for key 'uq_Versions_link'") [SQL: INSERT INTO Versions (documentid, link, intended_for, secret, method, position, path) VALUES (%(documentid)s, %(link)s, %(intended_for)s, %(secret)s, %(method)s, %(position)s, %(path)s) ] [parameters: {'documentid': 1, 'link': 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b', 'intended_for': 'Mickey Mouse', 'secret': 'secret', 'method': 'robust-xmp', 'position': 'metadata-only', 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username\\watermarks\\My File__Mickey_Mouse.pdf'}] (Background on this error at: https://sqlalche.me/e/20/gkpj) ERROR server:server.py:1007 Watermark applicability check failed for document 1: "Unknown watermarking method: 'watermarkmethod'. Known: ['overlay-watermark', 'robust-xmp', 'signed-annots']" WARNING server:server.py:972 Document not found or access denied for watermarking id=8 WARNING server:server.py:934 Missing document id in request WARNING server:server.py:948 Missing required fields for watermarking: {'id': 1, 'intended_for': 'Mickey Mouse', 'key': 'key', 'position': 'metadata-only', 'secret': 'secret'} ERROR server:server.py:1034 Watermarking failed for document 1 using method overlay-watermark: unsupported operand type(s) for |: 'str' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 1 failed, 13 passed, 22 warnings in 19.88s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2315"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2315_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2315_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2315_1"><button class="btn btn-outline-success"><span class="job_id">2315 : Job ID ab8aab9b9be84474b4bd3663ed16acb6</span></button></div></a><div aria-labelledby="job_list___sub_heading_2315_1" data-parent="#job_list___sub_accordion_2315" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2315_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=102" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (102, 50), end pos: (102, 51)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitOr, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -99,7 +99,7 @@ if not intended_for: raise ValueError("Missing recipient. (intended_for)") visibly_watermarked = self.visible_watermark( - data, "Intended for: " + intended_for + "\nDo not disclose" + data, "Intended for: " + intended_for | "\nDo not disclose" ) if not secret:</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("id"), int) assert isinstance(data.get("documentid"), int) assert isinstance(data.get("link"), str) assert isinstance(data.get("intended_for"), str) assert isinstance(data.get("method"), str) assert isinstance(data.get("position"), str) assert isinstance(data.get("filename"), str) assert isinstance(data.get("size"), int) #check values assert data.get("documentid") == parameters["id"] assert data.get("intended_for") == parameters["intended_for"] assert data.get("method") == parameters["method"] assert data.get("position") == parameters["position"] #Tests with wrong parameters #Test with exact same call: should return database insertion error (Non unique entry) resp = client.post("/api/create-watermark", json=parameters) assert resp.status_code == 503 #Non existant method resp = client.post("/api/create-watermark", json={"method": "watermarkmethod", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Non existant document resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 8}) assert resp.status_code == 404 #Missing id resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"}) assert resp.status_code == 400 #Missing method resp = client.post("/api/create-watermark", json={"position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Missing position: no issue if method ignores # (NB: must change intended_for or secret etc! Else integrity error.) resp = client.post("/api/create-watermark", json={"method": "overlay-watermark", "key": "key", "secret": "secret", "intended_for":"John", "id": 1}) &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:363: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1097 Integrity error during version insert for document 1: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b' for key 'uq_Versions_link'") [SQL: INSERT INTO Versions (documentid, link, intended_for, secret, method, position, path) VALUES (%(documentid)s, %(link)s, %(intended_for)s, %(secret)s, %(method)s, %(position)s, %(path)s) ] [parameters: {'documentid': 1, 'link': 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b', 'intended_for': 'Mickey Mouse', 'secret': 'secret', 'method': 'robust-xmp', 'position': 'metadata-only', 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username\\watermarks\\My File__Mickey_Mouse.pdf'}] (Background on this error at: https://sqlalche.me/e/20/gkpj) ERROR server:server.py:1007 Watermark applicability check failed for document 1: "Unknown watermarking method: 'watermarkmethod'. Known: ['overlay-watermark', 'robust-xmp', 'signed-annots']" WARNING server:server.py:972 Document not found or access denied for watermarking id=8 WARNING server:server.py:934 Missing document id in request WARNING server:server.py:948 Missing required fields for watermarking: {'id': 1, 'intended_for': 'Mickey Mouse', 'key': 'key', 'position': 'metadata-only', 'secret': 'secret'} ERROR server:server.py:1034 Watermarking failed for document 1 using method overlay-watermark: unsupported operand type(s) for |: 'str' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 1 failed, 13 passed, 22 warnings in 20.38s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2316"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2316_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2316_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2316_1"><button class="btn btn-outline-success"><span class="job_id">2316 : Job ID 7ffdce64124c4bf7875c631cd92d1d3c</span></button></div></a><div aria-labelledby="job_list___sub_heading_2316_1" data-parent="#job_list___sub_accordion_2316" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2316_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=102" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (102, 35), end pos: (102, 36)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitAnd, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -99,7 +99,7 @@ if not intended_for: raise ValueError("Missing recipient. (intended_for)") visibly_watermarked = self.visible_watermark( - data, "Intended for: " + intended_for + "\nDo not disclose" + data, "Intended for: " &amp; intended_for + "\nDo not disclose" ) if not secret:</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("id"), int) assert isinstance(data.get("documentid"), int) assert isinstance(data.get("link"), str) assert isinstance(data.get("intended_for"), str) assert isinstance(data.get("method"), str) assert isinstance(data.get("position"), str) assert isinstance(data.get("filename"), str) assert isinstance(data.get("size"), int) #check values assert data.get("documentid") == parameters["id"] assert data.get("intended_for") == parameters["intended_for"] assert data.get("method") == parameters["method"] assert data.get("position") == parameters["position"] #Tests with wrong parameters #Test with exact same call: should return database insertion error (Non unique entry) resp = client.post("/api/create-watermark", json=parameters) assert resp.status_code == 503 #Non existant method resp = client.post("/api/create-watermark", json={"method": "watermarkmethod", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Non existant document resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 8}) assert resp.status_code == 404 #Missing id resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"}) assert resp.status_code == 400 #Missing method resp = client.post("/api/create-watermark", json={"position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Missing position: no issue if method ignores # (NB: must change intended_for or secret etc! Else integrity error.) resp = client.post("/api/create-watermark", json={"method": "overlay-watermark", "key": "key", "secret": "secret", "intended_for":"John", "id": 1}) &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:363: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1097 Integrity error during version insert for document 1: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b' for key 'uq_Versions_link'") [SQL: INSERT INTO Versions (documentid, link, intended_for, secret, method, position, path) VALUES (%(documentid)s, %(link)s, %(intended_for)s, %(secret)s, %(method)s, %(position)s, %(path)s) ] [parameters: {'documentid': 1, 'link': 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b', 'intended_for': 'Mickey Mouse', 'secret': 'secret', 'method': 'robust-xmp', 'position': 'metadata-only', 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username\\watermarks\\My File__Mickey_Mouse.pdf'}] (Background on this error at: https://sqlalche.me/e/20/gkpj) ERROR server:server.py:1007 Watermark applicability check failed for document 1: "Unknown watermarking method: 'watermarkmethod'. Known: ['overlay-watermark', 'robust-xmp', 'signed-annots']" WARNING server:server.py:972 Document not found or access denied for watermarking id=8 WARNING server:server.py:934 Missing document id in request WARNING server:server.py:948 Missing required fields for watermarking: {'id': 1, 'intended_for': 'Mickey Mouse', 'key': 'key', 'position': 'metadata-only', 'secret': 'secret'} ERROR server:server.py:1034 Watermarking failed for document 1 using method overlay-watermark: unsupported operand type(s) for &amp;: 'str' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 1 failed, 13 passed, 22 warnings in 20.12s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2317"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2317_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2317_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2317_1"><button class="btn btn-outline-success"><span class="job_id">2317 : Job ID d1c7fcb047034be99d1c55216ba29ec9</span></button></div></a><div aria-labelledby="job_list___sub_heading_2317_1" data-parent="#job_list___sub_accordion_2317" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2317_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=102" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (102, 50), end pos: (102, 51)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitAnd, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -99,7 +99,7 @@ if not intended_for: raise ValueError("Missing recipient. (intended_for)") visibly_watermarked = self.visible_watermark( - data, "Intended for: " + intended_for + "\nDo not disclose" + data, "Intended for: " + intended_for &amp; "\nDo not disclose" ) if not secret:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T012438595509Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T012439523954Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ERROR server:rmap_handler.py:245 Failed to add source PDF to database: No users exist to own RMAP base document; create a user first ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 11 failed, 3 passed, 22 warnings in 19.44s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2318"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2318_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2318_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2318_1"><button class="btn btn-outline-success"><span class="job_id">2318 : Job ID 2166bb096d754c949d024ef932c32e48</span></button></div></a><div aria-labelledby="job_list___sub_heading_2318_1" data-parent="#job_list___sub_accordion_2318" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2318_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=102" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (102, 35), end pos: (102, 36)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitXor, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -99,7 +99,7 @@ if not intended_for: raise ValueError("Missing recipient. (intended_for)") visibly_watermarked = self.visible_watermark( - data, "Intended for: " + intended_for + "\nDo not disclose" + data, "Intended for: " ^ intended_for + "\nDo not disclose" ) if not secret:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T024710965686Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T024711847860Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.30s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2319"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2319_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2319_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2319_1"><button class="btn btn-outline-success"><span class="job_id">2319 : Job ID 804128d0e4f6461db34f8d041a35ee10</span></button></div></a><div aria-labelledby="job_list___sub_heading_2319_1" data-parent="#job_list___sub_accordion_2319" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2319_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=102" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (102, 50), end pos: (102, 51)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitXor, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -99,7 +99,7 @@ if not intended_for: raise ValueError("Missing recipient. (intended_for)") visibly_watermarked = self.visible_watermark( - data, "Intended for: " + intended_for + "\nDo not disclose" + data, "Intended for: " + intended_for ^ "\nDo not disclose" ) if not secret:</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("id"), int) assert isinstance(data.get("documentid"), int) assert isinstance(data.get("link"), str) assert isinstance(data.get("intended_for"), str) assert isinstance(data.get("method"), str) assert isinstance(data.get("position"), str) assert isinstance(data.get("filename"), str) assert isinstance(data.get("size"), int) #check values assert data.get("documentid") == parameters["id"] assert data.get("intended_for") == parameters["intended_for"] assert data.get("method") == parameters["method"] assert data.get("position") == parameters["position"] #Tests with wrong parameters #Test with exact same call: should return database insertion error (Non unique entry) resp = client.post("/api/create-watermark", json=parameters) assert resp.status_code == 503 #Non existant method resp = client.post("/api/create-watermark", json={"method": "watermarkmethod", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Non existant document resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 8}) assert resp.status_code == 404 #Missing id resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"}) assert resp.status_code == 400 #Missing method resp = client.post("/api/create-watermark", json={"position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Missing position: no issue if method ignores # (NB: must change intended_for or secret etc! Else integrity error.) resp = client.post("/api/create-watermark", json={"method": "overlay-watermark", "key": "key", "secret": "secret", "intended_for":"John", "id": 1}) &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:363: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1097 Integrity error during version insert for document 1: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b' for key 'uq_Versions_link'") [SQL: INSERT INTO Versions (documentid, link, intended_for, secret, method, position, path) VALUES (%(documentid)s, %(link)s, %(intended_for)s, %(secret)s, %(method)s, %(position)s, %(path)s) ] [parameters: {'documentid': 1, 'link': 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b', 'intended_for': 'Mickey Mouse', 'secret': 'secret', 'method': 'robust-xmp', 'position': 'metadata-only', 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username\\watermarks\\My File__Mickey_Mouse.pdf'}] (Background on this error at: https://sqlalche.me/e/20/gkpj) ERROR server:server.py:1007 Watermark applicability check failed for document 1: "Unknown watermarking method: 'watermarkmethod'. Known: ['overlay-watermark', 'robust-xmp', 'signed-annots']" WARNING server:server.py:972 Document not found or access denied for watermarking id=8 WARNING server:server.py:934 Missing document id in request WARNING server:server.py:948 Missing required fields for watermarking: {'id': 1, 'intended_for': 'Mickey Mouse', 'key': 'key', 'position': 'metadata-only', 'secret': 'secret'} ERROR server:server.py:1034 Watermarking failed for document 1 using method overlay-watermark: unsupported operand type(s) for ^: 'str' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 1 failed, 13 passed, 22 warnings in 20.22s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2320"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2320_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2320_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2320_1"><button class="btn btn-outline-success"><span class="job_id">2320 : Job ID c6217404e49641ee9268ecc3c3827aa6</span></button></div></a><div aria-labelledby="job_list___sub_heading_2320_1" data-parent="#job_list___sub_accordion_2320" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2320_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=92" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (92, 26), end pos: (92, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -89,7 +89,7 @@ pdf, secret: str, key: str, - intended_for: str | None = None, + intended_for: str + None = None, position: str | None = None, ) -&gt; bytes: data = load_pdf_bytes(pdf)</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:16: in &lt;module&gt; import watermarking_utils as WMUtils watermarking_utils.py:38: in &lt;module&gt; from structural_and_overlay_watermark import StructuralOverlay structural_and_overlay_watermark.py:24: in &lt;module&gt; class StructuralOverlay(WatermarkingMethod): structural_and_overlay_watermark.py:92: in StructuralOverlay intended_for: str + None = None, ^^^^^^^^^^ E TypeError: unsupported operand type(s) for +: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-17T01:45:38+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T01:45:38+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_db-data Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_user-files Removing Network softsec-tatou_default Removing Volume softsec-tatou_user-files Resource is still in use Volume softsec-tatou_db-data Removed Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removed time="2025-10-17T01:45:39+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T01:45:39+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for +: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 7 warnings, 1 error in 13.11s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2321"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2321_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2321_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2321_1"><button class="btn btn-outline-success"><span class="job_id">2321 : Job ID 82c72963de844040aa252dd8ef966996</span></button></div></a><div aria-labelledby="job_list___sub_heading_2321_1" data-parent="#job_list___sub_accordion_2321" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2321_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=93" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (93, 22), end pos: (93, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -90,7 +90,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str + None = None, ) -&gt; bytes: data = load_pdf_bytes(pdf) # Add a visible watermark. This might confuse the attackers,</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:16: in &lt;module&gt; import watermarking_utils as WMUtils watermarking_utils.py:38: in &lt;module&gt; from structural_and_overlay_watermark import StructuralOverlay structural_and_overlay_watermark.py:24: in &lt;module&gt; class StructuralOverlay(WatermarkingMethod): structural_and_overlay_watermark.py:93: in StructuralOverlay position: str + None = None, ^^^^^^^^^^ E TypeError: unsupported operand type(s) for +: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T23:10:43+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T23:10:44+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_user-files Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_user-files Resource is still in use Volume softsec-tatou_db-data Removed Network softsec-tatou_default Removed time="2025-10-16T23:10:45+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T23:10:45+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for +: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 7 warnings, 1 error in 13.38s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2322"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2322_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2322_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2322_1"><button class="btn btn-outline-success"><span class="job_id">2322 : Job ID b84d1f0461254c5b87d30b54351edecd</span></button></div></a><div aria-labelledby="job_list___sub_heading_2322_1" data-parent="#job_list___sub_accordion_2322" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2322_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=125" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (125, 22), end pos: (125, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -122,7 +122,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str + None = None, ) -&gt; bool: return True </pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:16: in &lt;module&gt; import watermarking_utils as WMUtils watermarking_utils.py:38: in &lt;module&gt; from structural_and_overlay_watermark import StructuralOverlay structural_and_overlay_watermark.py:24: in &lt;module&gt; class StructuralOverlay(WatermarkingMethod): structural_and_overlay_watermark.py:125: in StructuralOverlay position: str + None = None, ^^^^^^^^^^ E TypeError: unsupported operand type(s) for +: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-17T03:15:25+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T03:15:25+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_user-files Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_grafana-data Resource is still in use Volume softsec-tatou_db-data Removed Network softsec-tatou_default Removed time="2025-10-17T03:15:26+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T03:15:26+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for +: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 7 warnings, 1 error in 13.00s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2323"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2323_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2323_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2323_1"><button class="btn btn-outline-success"><span class="job_id">2323 : Job ID 29bb521f186649e1ba89effea4b9c753</span></button></div></a><div aria-labelledby="job_list___sub_heading_2323_1" data-parent="#job_list___sub_accordion_2323" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2323_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=92" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (92, 26), end pos: (92, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -89,7 +89,7 @@ pdf, secret: str, key: str, - intended_for: str | None = None, + intended_for: str - None = None, position: str | None = None, ) -&gt; bytes: data = load_pdf_bytes(pdf)</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:16: in &lt;module&gt; import watermarking_utils as WMUtils watermarking_utils.py:38: in &lt;module&gt; from structural_and_overlay_watermark import StructuralOverlay structural_and_overlay_watermark.py:24: in &lt;module&gt; class StructuralOverlay(WatermarkingMethod): structural_and_overlay_watermark.py:92: in StructuralOverlay intended_for: str - None = None, ^^^^^^^^^^ E TypeError: unsupported operand type(s) for -: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-17T06:34:21+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T06:34:21+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_user-files Removing Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_db-data Removed Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removed time="2025-10-17T06:34:22+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T06:34:22+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for -: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 7 warnings, 1 error in 13.93s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2324"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2324_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2324_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2324_1"><button class="btn btn-outline-success"><span class="job_id">2324 : Job ID a8ccc8919e124947acc23248273c22e8</span></button></div></a><div aria-labelledby="job_list___sub_heading_2324_1" data-parent="#job_list___sub_accordion_2324" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2324_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=93" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (93, 22), end pos: (93, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -90,7 +90,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str - None = None, ) -&gt; bytes: data = load_pdf_bytes(pdf) # Add a visible watermark. This might confuse the attackers,</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:16: in &lt;module&gt; import watermarking_utils as WMUtils watermarking_utils.py:38: in &lt;module&gt; from structural_and_overlay_watermark import StructuralOverlay structural_and_overlay_watermark.py:24: in &lt;module&gt; class StructuralOverlay(WatermarkingMethod): structural_and_overlay_watermark.py:93: in StructuralOverlay position: str - None = None, ^^^^^^^^^^ E TypeError: unsupported operand type(s) for -: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T19:39:39+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T19:39:39+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_user-files Removing Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_db-data Removed Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removed time="2025-10-16T19:39:40+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T19:39:40+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for -: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 7 warnings, 1 error in 12.98s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2325"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2325_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2325_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2325_1"><button class="btn btn-outline-success"><span class="job_id">2325 : Job ID 08f05526b3a343258633e2e521c5ffb3</span></button></div></a><div aria-labelledby="job_list___sub_heading_2325_1" data-parent="#job_list___sub_accordion_2325" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2325_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=125" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (125, 22), end pos: (125, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -122,7 +122,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str - None = None, ) -&gt; bool: return True </pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:16: in &lt;module&gt; import watermarking_utils as WMUtils watermarking_utils.py:38: in &lt;module&gt; from structural_and_overlay_watermark import StructuralOverlay structural_and_overlay_watermark.py:24: in &lt;module&gt; class StructuralOverlay(WatermarkingMethod): structural_and_overlay_watermark.py:125: in StructuralOverlay position: str - None = None, ^^^^^^^^^^ E TypeError: unsupported operand type(s) for -: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T23:37:41+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T23:37:41+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_user-files Removing Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_user-files Resource is still in use Volume softsec-tatou_db-data Removed Network softsec-tatou_default Removed time="2025-10-16T23:37:42+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T23:37:42+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for -: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 7 warnings, 1 error in 13.04s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2326"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2326_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2326_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2326_1"><button class="btn btn-outline-success"><span class="job_id">2326 : Job ID 773ec24d09354faf84539345025dda28</span></button></div></a><div aria-labelledby="job_list___sub_heading_2326_1" data-parent="#job_list___sub_accordion_2326" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2326_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=92" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (92, 26), end pos: (92, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -89,7 +89,7 @@ pdf, secret: str, key: str, - intended_for: str | None = None, + intended_for: str * None = None, position: str | None = None, ) -&gt; bytes: data = load_pdf_bytes(pdf)</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:16: in &lt;module&gt; import watermarking_utils as WMUtils watermarking_utils.py:38: in &lt;module&gt; from structural_and_overlay_watermark import StructuralOverlay structural_and_overlay_watermark.py:24: in &lt;module&gt; class StructuralOverlay(WatermarkingMethod): structural_and_overlay_watermark.py:92: in StructuralOverlay intended_for: str * None = None, ^^^^^^^^^^ E TypeError: unsupported operand type(s) for *: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T23:25:39+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T23:25:39+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_db-data Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_user-files Removing Network softsec-tatou_default Removing Volume softsec-tatou_grafana-data Resource is still in use Volume softsec-tatou_db-data Removed Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removed time="2025-10-16T23:25:40+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T23:25:40+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for *: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 7 warnings, 1 error in 13.35s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2327"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2327_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2327_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2327_1"><button class="btn btn-outline-success"><span class="job_id">2327 : Job ID b9ced3e829004edb980e0342c74e847e</span></button></div></a><div aria-labelledby="job_list___sub_heading_2327_1" data-parent="#job_list___sub_accordion_2327" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2327_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=93" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (93, 22), end pos: (93, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -90,7 +90,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str * None = None, ) -&gt; bytes: data = load_pdf_bytes(pdf) # Add a visible watermark. This might confuse the attackers,</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:16: in &lt;module&gt; import watermarking_utils as WMUtils watermarking_utils.py:38: in &lt;module&gt; from structural_and_overlay_watermark import StructuralOverlay structural_and_overlay_watermark.py:24: in &lt;module&gt; class StructuralOverlay(WatermarkingMethod): structural_and_overlay_watermark.py:93: in StructuralOverlay position: str * None = None, ^^^^^^^^^^ E TypeError: unsupported operand type(s) for *: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-17T01:37:03+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T01:37:03+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_user-files Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_grafana-data Resource is still in use Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_db-data Removed Network softsec-tatou_default Removed time="2025-10-17T01:37:04+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T01:37:04+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for *: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 7 warnings, 1 error in 13.08s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2328"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2328_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2328_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2328_1"><button class="btn btn-outline-success"><span class="job_id">2328 : Job ID 19d17971b53d4cba81572a780d367e72</span></button></div></a><div aria-labelledby="job_list___sub_heading_2328_1" data-parent="#job_list___sub_accordion_2328" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2328_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=125" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (125, 22), end pos: (125, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -122,7 +122,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str * None = None, ) -&gt; bool: return True </pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:16: in &lt;module&gt; import watermarking_utils as WMUtils watermarking_utils.py:38: in &lt;module&gt; from structural_and_overlay_watermark import StructuralOverlay structural_and_overlay_watermark.py:24: in &lt;module&gt; class StructuralOverlay(WatermarkingMethod): structural_and_overlay_watermark.py:125: in StructuralOverlay position: str * None = None, ^^^^^^^^^^ E TypeError: unsupported operand type(s) for *: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-17T04:51:21+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T04:51:21+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_user-files Removing Network softsec-tatou_default Removing Volume softsec-tatou_grafana-data Resource is still in use Volume softsec-tatou_user-files Resource is still in use Volume softsec-tatou_db-data Removed Network softsec-tatou_default Removed time="2025-10-17T04:51:22+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T04:51:22+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for *: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 7 warnings, 1 error in 13.03s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2329"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2329_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2329_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2329_1"><button class="btn btn-outline-success"><span class="job_id">2329 : Job ID 1c06b90becdd470f985bca9f73721978</span></button></div></a><div aria-labelledby="job_list___sub_heading_2329_1" data-parent="#job_list___sub_accordion_2329" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2329_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=92" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (92, 26), end pos: (92, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -89,7 +89,7 @@ pdf, secret: str, key: str, - intended_for: str | None = None, + intended_for: str / None = None, position: str | None = None, ) -&gt; bytes: data = load_pdf_bytes(pdf)</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:16: in &lt;module&gt; import watermarking_utils as WMUtils watermarking_utils.py:38: in &lt;module&gt; from structural_and_overlay_watermark import StructuralOverlay structural_and_overlay_watermark.py:24: in &lt;module&gt; class StructuralOverlay(WatermarkingMethod): structural_and_overlay_watermark.py:92: in StructuralOverlay intended_for: str / None = None, ^^^^^^^^^^ E TypeError: unsupported operand type(s) for /: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T21:50:27+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T21:50:28+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_user-files Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_user-files Resource is still in use Volume softsec-tatou_db-data Removed Network softsec-tatou_default Removed time="2025-10-16T21:50:29+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T21:50:29+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for /: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 7 warnings, 1 error in 13.15s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2330"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2330_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2330_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2330_1"><button class="btn btn-outline-success"><span class="job_id">2330 : Job ID 791b348ccd2245f78a3bfa87651038a5</span></button></div></a><div aria-labelledby="job_list___sub_heading_2330_1" data-parent="#job_list___sub_accordion_2330" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2330_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=93" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (93, 22), end pos: (93, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -90,7 +90,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str / None = None, ) -&gt; bytes: data = load_pdf_bytes(pdf) # Add a visible watermark. This might confuse the attackers,</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:16: in &lt;module&gt; import watermarking_utils as WMUtils watermarking_utils.py:38: in &lt;module&gt; from structural_and_overlay_watermark import StructuralOverlay structural_and_overlay_watermark.py:24: in &lt;module&gt; class StructuralOverlay(WatermarkingMethod): structural_and_overlay_watermark.py:93: in StructuralOverlay position: str / None = None, ^^^^^^^^^^ E TypeError: unsupported operand type(s) for /: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-17T04:44:22+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T04:44:23+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_user-files Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_grafana-data Resource is still in use Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_db-data Removed Network softsec-tatou_default Removed time="2025-10-17T04:44:24+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T04:44:24+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for /: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 7 warnings, 1 error in 13.17s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2331"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2331_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2331_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2331_1"><button class="btn btn-outline-success"><span class="job_id">2331 : Job ID f590970683004b0b96042cb0c24303d7</span></button></div></a><div aria-labelledby="job_list___sub_heading_2331_1" data-parent="#job_list___sub_accordion_2331" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2331_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=125" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (125, 22), end pos: (125, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -122,7 +122,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str / None = None, ) -&gt; bool: return True </pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:16: in &lt;module&gt; import watermarking_utils as WMUtils watermarking_utils.py:38: in &lt;module&gt; from structural_and_overlay_watermark import StructuralOverlay structural_and_overlay_watermark.py:24: in &lt;module&gt; class StructuralOverlay(WatermarkingMethod): structural_and_overlay_watermark.py:125: in StructuralOverlay position: str / None = None, ^^^^^^^^^^ E TypeError: unsupported operand type(s) for /: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T16:29:58+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T16:29:58+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_user-files Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_db-data Removing Network softsec-tatou_default Removing Volume softsec-tatou_user-files Resource is still in use Volume softsec-tatou_db-data Removed Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removed time="2025-10-16T16:29:59+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T16:29:59+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for /: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 7 warnings, 1 error in 13.16s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2332"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2332_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2332_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2332_1"><button class="btn btn-outline-success"><span class="job_id">2332 : Job ID 114160b743ac4daea6ed90e2aca85922</span></button></div></a><div aria-labelledby="job_list___sub_heading_2332_1" data-parent="#job_list___sub_accordion_2332" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2332_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=92" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (92, 26), end pos: (92, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -89,7 +89,7 @@ pdf, secret: str, key: str, - intended_for: str | None = None, + intended_for: str // None = None, position: str | None = None, ) -&gt; bytes: data = load_pdf_bytes(pdf)</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:16: in &lt;module&gt; import watermarking_utils as WMUtils watermarking_utils.py:38: in &lt;module&gt; from structural_and_overlay_watermark import StructuralOverlay structural_and_overlay_watermark.py:24: in &lt;module&gt; class StructuralOverlay(WatermarkingMethod): structural_and_overlay_watermark.py:92: in StructuralOverlay intended_for: str // None = None, ^^^^^^^^^^^ E TypeError: unsupported operand type(s) for //: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-17T02:11:09+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T02:11:09+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_user-files Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_user-files Resource is still in use Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_db-data Removed Network softsec-tatou_default Removed time="2025-10-17T02:11:10+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T02:11:10+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for //: 't... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 7 warnings, 1 error in 12.93s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2333"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2333_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2333_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2333_1"><button class="btn btn-outline-success"><span class="job_id">2333 : Job ID bdc81db31c244b44b61722e0e2694157</span></button></div></a><div aria-labelledby="job_list___sub_heading_2333_1" data-parent="#job_list___sub_accordion_2333" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2333_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=93" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (93, 22), end pos: (93, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -90,7 +90,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str // None = None, ) -&gt; bytes: data = load_pdf_bytes(pdf) # Add a visible watermark. This might confuse the attackers,</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:16: in &lt;module&gt; import watermarking_utils as WMUtils watermarking_utils.py:38: in &lt;module&gt; from structural_and_overlay_watermark import StructuralOverlay structural_and_overlay_watermark.py:24: in &lt;module&gt; class StructuralOverlay(WatermarkingMethod): structural_and_overlay_watermark.py:93: in StructuralOverlay position: str // None = None, ^^^^^^^^^^^ E TypeError: unsupported operand type(s) for //: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T22:51:32+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T22:51:32+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_user-files Removing Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_user-files Resource is still in use Volume softsec-tatou_db-data Removed Network softsec-tatou_default Removed time="2025-10-16T22:51:33+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T22:51:33+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for //: 't... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 7 warnings, 1 error in 13.52s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2334"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2334_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2334_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2334_1"><button class="btn btn-outline-success"><span class="job_id">2334 : Job ID 5d4ed0b8b5c64e91a26d0320c30e8161</span></button></div></a><div aria-labelledby="job_list___sub_heading_2334_1" data-parent="#job_list___sub_accordion_2334" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2334_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=125" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (125, 22), end pos: (125, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -122,7 +122,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str // None = None, ) -&gt; bool: return True </pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:16: in &lt;module&gt; import watermarking_utils as WMUtils watermarking_utils.py:38: in &lt;module&gt; from structural_and_overlay_watermark import StructuralOverlay structural_and_overlay_watermark.py:24: in &lt;module&gt; class StructuralOverlay(WatermarkingMethod): structural_and_overlay_watermark.py:125: in StructuralOverlay position: str // None = None, ^^^^^^^^^^^ E TypeError: unsupported operand type(s) for //: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T18:02:53+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T18:02:53+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_user-files Removing Network softsec-tatou_default Removing Volume softsec-tatou_grafana-data Resource is still in use Volume softsec-tatou_db-data Removed Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removed time="2025-10-16T18:02:54+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T18:02:54+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for //: 't... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 7 warnings, 1 error in 13.00s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2335"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2335_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2335_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2335_1"><button class="btn btn-outline-success"><span class="job_id">2335 : Job ID 0b470b08f1ca448b82e6fce476cbec69</span></button></div></a><div aria-labelledby="job_list___sub_heading_2335_1" data-parent="#job_list___sub_accordion_2335" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2335_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=92" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (92, 26), end pos: (92, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -89,7 +89,7 @@ pdf, secret: str, key: str, - intended_for: str | None = None, + intended_for: str % None = None, position: str | None = None, ) -&gt; bytes: data = load_pdf_bytes(pdf)</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:16: in &lt;module&gt; import watermarking_utils as WMUtils watermarking_utils.py:38: in &lt;module&gt; from structural_and_overlay_watermark import StructuralOverlay structural_and_overlay_watermark.py:24: in &lt;module&gt; class StructuralOverlay(WatermarkingMethod): structural_and_overlay_watermark.py:92: in StructuralOverlay intended_for: str % None = None, ^^^^^^^^^^ E TypeError: unsupported operand type(s) for %: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T17:16:59+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T17:16:59+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_user-files Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_db-data Removed Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removed time="2025-10-16T17:17:00+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T17:17:00+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for %: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 7 warnings, 1 error in 13.02s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2336"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2336_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2336_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2336_1"><button class="btn btn-outline-success"><span class="job_id">2336 : Job ID abd72ad268c740c7bf0f638492b20f6f</span></button></div></a><div aria-labelledby="job_list___sub_heading_2336_1" data-parent="#job_list___sub_accordion_2336" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2336_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=93" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (93, 22), end pos: (93, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -90,7 +90,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str % None = None, ) -&gt; bytes: data = load_pdf_bytes(pdf) # Add a visible watermark. This might confuse the attackers,</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:16: in &lt;module&gt; import watermarking_utils as WMUtils watermarking_utils.py:38: in &lt;module&gt; from structural_and_overlay_watermark import StructuralOverlay structural_and_overlay_watermark.py:24: in &lt;module&gt; class StructuralOverlay(WatermarkingMethod): structural_and_overlay_watermark.py:93: in StructuralOverlay position: str % None = None, ^^^^^^^^^^ E TypeError: unsupported operand type(s) for %: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T18:02:40+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T18:02:40+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_user-files Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_user-files Resource is still in use Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_db-data Removed Network softsec-tatou_default Removed time="2025-10-16T18:02:41+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T18:02:41+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for %: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 7 warnings, 1 error in 13.06s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2337"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2337_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2337_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2337_1"><button class="btn btn-outline-success"><span class="job_id">2337 : Job ID e0e79b196a15400d9af09c44331ecbd5</span></button></div></a><div aria-labelledby="job_list___sub_heading_2337_1" data-parent="#job_list___sub_accordion_2337" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2337_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=125" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (125, 22), end pos: (125, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -122,7 +122,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str % None = None, ) -&gt; bool: return True </pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:16: in &lt;module&gt; import watermarking_utils as WMUtils watermarking_utils.py:38: in &lt;module&gt; from structural_and_overlay_watermark import StructuralOverlay structural_and_overlay_watermark.py:24: in &lt;module&gt; class StructuralOverlay(WatermarkingMethod): structural_and_overlay_watermark.py:125: in StructuralOverlay position: str % None = None, ^^^^^^^^^^ E TypeError: unsupported operand type(s) for %: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T17:12:58+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T17:12:59+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_db-data Removing Volume softsec-tatou_user-files Removing Volume softsec-tatou_grafana-data Removing Network softsec-tatou_default Removing Volume softsec-tatou_db-data Removed Volume softsec-tatou_grafana-data Resource is still in use Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removed time="2025-10-16T17:13:00+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T17:13:00+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for %: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 7 warnings, 1 error in 13.04s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2338"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2338_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2338_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2338_1"><button class="btn btn-outline-success"><span class="job_id">2338 : Job ID 307126bd37fd4714a77979fdccd3c054</span></button></div></a><div aria-labelledby="job_list___sub_heading_2338_1" data-parent="#job_list___sub_accordion_2338" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2338_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=92" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (92, 26), end pos: (92, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -89,7 +89,7 @@ pdf, secret: str, key: str, - intended_for: str | None = None, + intended_for: str ** None = None, position: str | None = None, ) -&gt; bytes: data = load_pdf_bytes(pdf)</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:16: in &lt;module&gt; import watermarking_utils as WMUtils watermarking_utils.py:38: in &lt;module&gt; from structural_and_overlay_watermark import StructuralOverlay structural_and_overlay_watermark.py:24: in &lt;module&gt; class StructuralOverlay(WatermarkingMethod): structural_and_overlay_watermark.py:92: in StructuralOverlay intended_for: str ** None = None, ^^^^^^^^^^^ E TypeError: unsupported operand type(s) for ** or pow(): 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T18:07:39+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T18:07:39+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_user-files Removing Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_db-data Removed Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removed time="2025-10-16T18:07:40+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T18:07:40+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for ** or ... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 7 warnings, 1 error in 12.99s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2339"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2339_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2339_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2339_1"><button class="btn btn-outline-success"><span class="job_id">2339 : Job ID c073fa24e34c49f1b677c5c6212008d2</span></button></div></a><div aria-labelledby="job_list___sub_heading_2339_1" data-parent="#job_list___sub_accordion_2339" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2339_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=93" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (93, 22), end pos: (93, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -90,7 +90,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str ** None = None, ) -&gt; bytes: data = load_pdf_bytes(pdf) # Add a visible watermark. This might confuse the attackers,</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:16: in &lt;module&gt; import watermarking_utils as WMUtils watermarking_utils.py:38: in &lt;module&gt; from structural_and_overlay_watermark import StructuralOverlay structural_and_overlay_watermark.py:24: in &lt;module&gt; class StructuralOverlay(WatermarkingMethod): structural_and_overlay_watermark.py:93: in StructuralOverlay position: str ** None = None, ^^^^^^^^^^^ E TypeError: unsupported operand type(s) for ** or pow(): 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-17T02:05:02+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T02:05:02+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_user-files Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_user-files Resource is still in use Volume softsec-tatou_db-data Removed Network softsec-tatou_default Removed time="2025-10-17T02:05:03+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T02:05:03+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for ** or ... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 7 warnings, 1 error in 12.95s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2340"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2340_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2340_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2340_1"><button class="btn btn-outline-success"><span class="job_id">2340 : Job ID cdc6db6ccc3d484e89d363671bdaff42</span></button></div></a><div aria-labelledby="job_list___sub_heading_2340_1" data-parent="#job_list___sub_accordion_2340" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2340_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=125" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (125, 22), end pos: (125, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -122,7 +122,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str ** None = None, ) -&gt; bool: return True </pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:16: in &lt;module&gt; import watermarking_utils as WMUtils watermarking_utils.py:38: in &lt;module&gt; from structural_and_overlay_watermark import StructuralOverlay structural_and_overlay_watermark.py:24: in &lt;module&gt; class StructuralOverlay(WatermarkingMethod): structural_and_overlay_watermark.py:125: in StructuralOverlay position: str ** None = None, ^^^^^^^^^^^ E TypeError: unsupported operand type(s) for ** or pow(): 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T21:20:57+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T21:20:57+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_user-files Removing Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_user-files Resource is still in use Volume softsec-tatou_db-data Removed Network softsec-tatou_default Removed time="2025-10-16T21:20:58+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T21:20:58+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for ** or ... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 7 warnings, 1 error in 13.21s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2341"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2341_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2341_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2341_1"><button class="btn btn-outline-success"><span class="job_id">2341 : Job ID 8637d1136d8349738f078992d04b1ae9</span></button></div></a><div aria-labelledby="job_list___sub_heading_2341_1" data-parent="#job_list___sub_accordion_2341" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2341_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=92" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (92, 26), end pos: (92, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -89,7 +89,7 @@ pdf, secret: str, key: str, - intended_for: str | None = None, + intended_for: str &gt;&gt; None = None, position: str | None = None, ) -&gt; bytes: data = load_pdf_bytes(pdf)</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:16: in &lt;module&gt; import watermarking_utils as WMUtils watermarking_utils.py:38: in &lt;module&gt; from structural_and_overlay_watermark import StructuralOverlay structural_and_overlay_watermark.py:24: in &lt;module&gt; class StructuralOverlay(WatermarkingMethod): structural_and_overlay_watermark.py:92: in StructuralOverlay intended_for: str &gt;&gt; None = None, ^^^^^^^^^^^ E TypeError: unsupported operand type(s) for &gt;&gt;: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-17T07:56:20+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T07:56:20+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_user-files Removing Network softsec-tatou_default Removing Volume softsec-tatou_db-data Removed Volume softsec-tatou_grafana-data Resource is still in use Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removed time="2025-10-17T07:56:21+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T07:56:21+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for &gt;&gt;: 't... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 7 warnings, 1 error in 13.21s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2342"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2342_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2342_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2342_1"><button class="btn btn-outline-success"><span class="job_id">2342 : Job ID 187435b3161d4684bc7d5367eea59f58</span></button></div></a><div aria-labelledby="job_list___sub_heading_2342_1" data-parent="#job_list___sub_accordion_2342" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2342_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=93" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (93, 22), end pos: (93, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -90,7 +90,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str &gt;&gt; None = None, ) -&gt; bytes: data = load_pdf_bytes(pdf) # Add a visible watermark. This might confuse the attackers,</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:16: in &lt;module&gt; import watermarking_utils as WMUtils watermarking_utils.py:38: in &lt;module&gt; from structural_and_overlay_watermark import StructuralOverlay structural_and_overlay_watermark.py:24: in &lt;module&gt; class StructuralOverlay(WatermarkingMethod): structural_and_overlay_watermark.py:93: in StructuralOverlay position: str &gt;&gt; None = None, ^^^^^^^^^^^ E TypeError: unsupported operand type(s) for &gt;&gt;: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-17T08:17:45+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T08:17:45+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_db-data Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_user-files Removing Volume softsec-tatou_grafana-data Resource is still in use Volume softsec-tatou_db-data Removed Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removing Network softsec-tatou_default Removed time="2025-10-17T08:17:46+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T08:17:46+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for &gt;&gt;: 't... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 7 warnings, 1 error in 13.82s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2343"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2343_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2343_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2343_1"><button class="btn btn-outline-success"><span class="job_id">2343 : Job ID 66bd430e8a894c7bb951f11c80c965c9</span></button></div></a><div aria-labelledby="job_list___sub_heading_2343_1" data-parent="#job_list___sub_accordion_2343" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2343_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=125" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (125, 22), end pos: (125, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -122,7 +122,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str &gt;&gt; None = None, ) -&gt; bool: return True </pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:16: in &lt;module&gt; import watermarking_utils as WMUtils watermarking_utils.py:38: in &lt;module&gt; from structural_and_overlay_watermark import StructuralOverlay structural_and_overlay_watermark.py:24: in &lt;module&gt; class StructuralOverlay(WatermarkingMethod): structural_and_overlay_watermark.py:125: in StructuralOverlay position: str &gt;&gt; None = None, ^^^^^^^^^^^ E TypeError: unsupported operand type(s) for &gt;&gt;: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T16:18:58+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T16:18:58+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_user-files Removing Volume softsec-tatou_db-data Removing Network softsec-tatou_default Removing Volume softsec-tatou_user-files Resource is still in use Volume softsec-tatou_grafana-data Resource is still in use Volume softsec-tatou_db-data Removed Network softsec-tatou_default Removed time="2025-10-16T16:18:59+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T16:18:59+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for &gt;&gt;: 't... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 7 warnings, 1 error in 13.05s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2344"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2344_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2344_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2344_1"><button class="btn btn-outline-success"><span class="job_id">2344 : Job ID f90c36ff34114fa6ac81515fd9503862</span></button></div></a><div aria-labelledby="job_list___sub_heading_2344_1" data-parent="#job_list___sub_accordion_2344" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2344_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=92" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (92, 26), end pos: (92, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -89,7 +89,7 @@ pdf, secret: str, key: str, - intended_for: str | None = None, + intended_for: str &lt;&lt; None = None, position: str | None = None, ) -&gt; bytes: data = load_pdf_bytes(pdf)</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:16: in &lt;module&gt; import watermarking_utils as WMUtils watermarking_utils.py:38: in &lt;module&gt; from structural_and_overlay_watermark import StructuralOverlay structural_and_overlay_watermark.py:24: in &lt;module&gt; class StructuralOverlay(WatermarkingMethod): structural_and_overlay_watermark.py:92: in StructuralOverlay intended_for: str &lt;&lt; None = None, ^^^^^^^^^^^ E TypeError: unsupported operand type(s) for &lt;&lt;: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T23:06:44+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T23:06:44+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_user-files Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_grafana-data Resource is still in use Volume softsec-tatou_db-data Removed Network softsec-tatou_default Removed time="2025-10-16T23:06:45+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T23:06:45+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for &lt;&lt;: 't... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 7 warnings, 1 error in 13.49s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2345"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2345_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2345_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2345_1"><button class="btn btn-outline-success"><span class="job_id">2345 : Job ID c7944b03b8e94df78a2d27787cdc38c4</span></button></div></a><div aria-labelledby="job_list___sub_heading_2345_1" data-parent="#job_list___sub_accordion_2345" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2345_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=93" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (93, 22), end pos: (93, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -90,7 +90,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str &lt;&lt; None = None, ) -&gt; bytes: data = load_pdf_bytes(pdf) # Add a visible watermark. This might confuse the attackers,</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:16: in &lt;module&gt; import watermarking_utils as WMUtils watermarking_utils.py:38: in &lt;module&gt; from structural_and_overlay_watermark import StructuralOverlay structural_and_overlay_watermark.py:24: in &lt;module&gt; class StructuralOverlay(WatermarkingMethod): structural_and_overlay_watermark.py:93: in StructuralOverlay position: str &lt;&lt; None = None, ^^^^^^^^^^^ E TypeError: unsupported operand type(s) for &lt;&lt;: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-17T00:30:00+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T00:30:00+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_user-files Removing Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_user-files Resource is still in use Volume softsec-tatou_db-data Removed Network softsec-tatou_default Removed time="2025-10-17T00:30:01+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T00:30:01+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for &lt;&lt;: 't... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 7 warnings, 1 error in 13.42s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2346"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2346_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2346_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2346_1"><button class="btn btn-outline-success"><span class="job_id">2346 : Job ID 27f87821e82a4e5b81a5fcc552cb421e</span></button></div></a><div aria-labelledby="job_list___sub_heading_2346_1" data-parent="#job_list___sub_accordion_2346" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2346_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=125" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (125, 22), end pos: (125, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -122,7 +122,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str &lt;&lt; None = None, ) -&gt; bool: return True </pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:16: in &lt;module&gt; import watermarking_utils as WMUtils watermarking_utils.py:38: in &lt;module&gt; from structural_and_overlay_watermark import StructuralOverlay structural_and_overlay_watermark.py:24: in &lt;module&gt; class StructuralOverlay(WatermarkingMethod): structural_and_overlay_watermark.py:125: in StructuralOverlay position: str &lt;&lt; None = None, ^^^^^^^^^^^ E TypeError: unsupported operand type(s) for &lt;&lt;: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-17T03:56:23+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T03:56:23+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_user-files Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_user-files Resource is still in use Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_db-data Removed Network softsec-tatou_default Removed time="2025-10-17T03:56:24+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T03:56:24+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for &lt;&lt;: 't... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 7 warnings, 1 error in 13.02s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2347"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2347_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2347_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2347_1"><button class="btn btn-outline-success"><span class="job_id">2347 : Job ID 93cd40b9239f411c8790292e725a26ca</span></button></div></a><div aria-labelledby="job_list___sub_heading_2347_1" data-parent="#job_list___sub_accordion_2347" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2347_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=92" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (92, 26), end pos: (92, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -89,7 +89,7 @@ pdf, secret: str, key: str, - intended_for: str | None = None, + intended_for: str &amp; None = None, position: str | None = None, ) -&gt; bytes: data = load_pdf_bytes(pdf)</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:16: in &lt;module&gt; import watermarking_utils as WMUtils watermarking_utils.py:38: in &lt;module&gt; from structural_and_overlay_watermark import StructuralOverlay structural_and_overlay_watermark.py:24: in &lt;module&gt; class StructuralOverlay(WatermarkingMethod): structural_and_overlay_watermark.py:92: in StructuralOverlay intended_for: str &amp; None = None, ^^^^^^^^^^ E TypeError: unsupported operand type(s) for &amp;: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-17T06:22:22+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T06:22:22+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_user-files Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_user-files Resource is still in use Volume softsec-tatou_db-data Removed Network softsec-tatou_default Removed time="2025-10-17T06:22:23+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T06:22:23+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for &amp;: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 7 warnings, 1 error in 13.51s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2348"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2348_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2348_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2348_1"><button class="btn btn-outline-success"><span class="job_id">2348 : Job ID d931a9c8150b44baa66098297430d9a5</span></button></div></a><div aria-labelledby="job_list___sub_heading_2348_1" data-parent="#job_list___sub_accordion_2348" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2348_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=93" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (93, 22), end pos: (93, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -90,7 +90,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str &amp; None = None, ) -&gt; bytes: data = load_pdf_bytes(pdf) # Add a visible watermark. This might confuse the attackers,</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:16: in &lt;module&gt; import watermarking_utils as WMUtils watermarking_utils.py:38: in &lt;module&gt; from structural_and_overlay_watermark import StructuralOverlay structural_and_overlay_watermark.py:24: in &lt;module&gt; class StructuralOverlay(WatermarkingMethod): structural_and_overlay_watermark.py:93: in StructuralOverlay position: str &amp; None = None, ^^^^^^^^^^ E TypeError: unsupported operand type(s) for &amp;: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T22:36:47+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T22:36:47+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_db-data Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_user-files Removing Volume softsec-tatou_db-data Removed Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removed time="2025-10-16T22:36:48+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T22:36:49+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for &amp;: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 7 warnings, 1 error in 13.39s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2349"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2349_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2349_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2349_1"><button class="btn btn-outline-success"><span class="job_id">2349 : Job ID e251f955fd8f48d98036932ade533bbb</span></button></div></a><div aria-labelledby="job_list___sub_heading_2349_1" data-parent="#job_list___sub_accordion_2349" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2349_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=125" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (125, 22), end pos: (125, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -122,7 +122,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str &amp; None = None, ) -&gt; bool: return True </pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:16: in &lt;module&gt; import watermarking_utils as WMUtils watermarking_utils.py:38: in &lt;module&gt; from structural_and_overlay_watermark import StructuralOverlay structural_and_overlay_watermark.py:24: in &lt;module&gt; class StructuralOverlay(WatermarkingMethod): structural_and_overlay_watermark.py:125: in StructuralOverlay position: str &amp; None = None, ^^^^^^^^^^ E TypeError: unsupported operand type(s) for &amp;: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-17T03:34:55+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T03:34:55+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_db-data Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_user-files Removing Network softsec-tatou_default Removing Volume softsec-tatou_db-data Removed Volume softsec-tatou_grafana-data Resource is still in use Volume softsec-tatou_user-files Resource is still in use Network softsec-tatou_default Removed time="2025-10-17T03:34:56+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T03:34:56+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for &amp;: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 7 warnings, 1 error in 12.94s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2350"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2350_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2350_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2350_1"><button class="btn btn-outline-success"><span class="job_id">2350 : Job ID fced66dd81c44332a7d415a53c9e54d9</span></button></div></a><div aria-labelledby="job_list___sub_heading_2350_1" data-parent="#job_list___sub_accordion_2350" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2350_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=92" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (92, 26), end pos: (92, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -89,7 +89,7 @@ pdf, secret: str, key: str, - intended_for: str | None = None, + intended_for: str ^ None = None, position: str | None = None, ) -&gt; bytes: data = load_pdf_bytes(pdf)</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:16: in &lt;module&gt; import watermarking_utils as WMUtils watermarking_utils.py:38: in &lt;module&gt; from structural_and_overlay_watermark import StructuralOverlay structural_and_overlay_watermark.py:24: in &lt;module&gt; class StructuralOverlay(WatermarkingMethod): structural_and_overlay_watermark.py:92: in StructuralOverlay intended_for: str ^ None = None, ^^^^^^^^^^ E TypeError: unsupported operand type(s) for ^: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-17T05:20:49+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T05:20:49+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_db-data Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_user-files Removing Network softsec-tatou_default Removing Volume softsec-tatou_db-data Removed Volume softsec-tatou_user-files Resource is still in use Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removed time="2025-10-17T05:20:50+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T05:20:51+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for ^: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 7 warnings, 1 error in 13.06s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2351"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2351_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2351_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2351_1"><button class="btn btn-outline-success"><span class="job_id">2351 : Job ID 39acfa0761c549b7abef4f7217c763ee</span></button></div></a><div aria-labelledby="job_list___sub_heading_2351_1" data-parent="#job_list___sub_accordion_2351" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2351_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=93" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (93, 22), end pos: (93, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -90,7 +90,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str ^ None = None, ) -&gt; bytes: data = load_pdf_bytes(pdf) # Add a visible watermark. This might confuse the attackers,</pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:16: in &lt;module&gt; import watermarking_utils as WMUtils watermarking_utils.py:38: in &lt;module&gt; from structural_and_overlay_watermark import StructuralOverlay structural_and_overlay_watermark.py:24: in &lt;module&gt; class StructuralOverlay(WatermarkingMethod): structural_and_overlay_watermark.py:93: in StructuralOverlay position: str ^ None = None, ^^^^^^^^^^ E TypeError: unsupported operand type(s) for ^: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-16T22:46:45+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T22:46:45+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_user-files Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removing Volume softsec-tatou_user-files Resource is still in use Volume softsec-tatou_db-data Removed Network softsec-tatou_default Removed time="2025-10-16T22:46:47+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-16T22:46:47+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for ^: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 7 warnings, 1 error in 13.98s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2352"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2352_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2352_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2352_1"><button class="btn btn-outline-success"><span class="job_id">2352 : Job ID e559e09acf754debbf7bf8ba3b231301</span></button></div></a><div aria-labelledby="job_list___sub_heading_2352_1" data-parent="#job_list___sub_accordion_2352" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2352_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=125" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (125, 22), end pos: (125, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -122,7 +122,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str ^ None = None, ) -&gt; bool: return True </pre></div><div class="alert alert-secondary"><pre class="diff"> =================================== ERRORS ==================================== ______________________ ERROR collecting test/test_api.py ______________________ ..\test\test_api.py:33: in &lt;module&gt; from server import create_app server.py:16: in &lt;module&gt; import watermarking_utils as WMUtils watermarking_utils.py:38: in &lt;module&gt; from structural_and_overlay_watermark import StructuralOverlay structural_and_overlay_watermark.py:24: in &lt;module&gt; class StructuralOverlay(WatermarkingMethod): structural_and_overlay_watermark.py:125: in StructuralOverlay position: str ^ None = None, ^^^^^^^^^^ E TypeError: unsupported operand type(s) for ^: 'type' and 'NoneType' ------------------------------- Captured stdout ------------------------------- Running prepare_env.bat... Waiting for db to be ready... ------------------------------- Captured stderr ------------------------------- time="2025-10-17T06:43:22+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T06:43:22+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Container softsec-tatou-db-1 Stopping Container softsec-tatou-db-1 Stopped Container softsec-tatou-db-1 Removing Container softsec-tatou-db-1 Removed Volume softsec-tatou_user-files Removing Volume softsec-tatou_db-data Removing Volume softsec-tatou_grafana-data Removing Volume softsec-tatou_db-data Removed Volume softsec-tatou_user-files Resource is still in use Volume softsec-tatou_grafana-data Resource is still in use Network softsec-tatou_default Removing Network softsec-tatou_default Removed time="2025-10-17T06:43:23+02:00" level=warning msg="The \"METRICS_TOKEN\" variable is not set. Defaulting to a blank string." time="2025-10-17T06:43:23+02:00" level=warning msg="The \"SECRET_KEY\" variable is not set. Defaulting to a blank string." Network softsec-tatou_default Creating Network softsec-tatou_default Created Volume "softsec-tatou_db-data" Creating Volume "softsec-tatou_db-data" Created Container softsec-tatou-db-1 Creating Container softsec-tatou-db-1 Created Container softsec-tatou-db-1 Starting Container softsec-tatou-db-1 Started ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== ERROR ..\test\test_api.py - TypeError: unsupported operand type(s) for ^: 'ty... !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! 7 warnings, 1 error in 13.34s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2353"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2353_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2353_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2353_1"><button class="btn btn-outline-success"><span class="job_id">2353 : Job ID 95d41fa25bb64b2da8f30c6329e304e2</span></button></div></a><div aria-labelledby="job_list___sub_heading_2353_1" data-parent="#job_list___sub_accordion_2353" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2353_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=99" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (99, 11), end pos: (99, 14)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -96,7 +96,7 @@ # Add a visible watermark. This might confuse the attackers, # suggesting that the only watermark is the visible watermark. # It also works as a deterrent against document diffusion. - if not intended_for: + if intended_for: raise ValueError("Missing recipient. (intended_for)") visibly_watermarked = self.visible_watermark( data, "Intended for: " + intended_for + "\nDo not disclose"</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("id"), int) assert isinstance(data.get("documentid"), int) assert isinstance(data.get("link"), str) assert isinstance(data.get("intended_for"), str) assert isinstance(data.get("method"), str) assert isinstance(data.get("position"), str) assert isinstance(data.get("filename"), str) assert isinstance(data.get("size"), int) #check values assert data.get("documentid") == parameters["id"] assert data.get("intended_for") == parameters["intended_for"] assert data.get("method") == parameters["method"] assert data.get("position") == parameters["position"] #Tests with wrong parameters #Test with exact same call: should return database insertion error (Non unique entry) resp = client.post("/api/create-watermark", json=parameters) assert resp.status_code == 503 #Non existant method resp = client.post("/api/create-watermark", json={"method": "watermarkmethod", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Non existant document resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 8}) assert resp.status_code == 404 #Missing id resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"}) assert resp.status_code == 400 #Missing method resp = client.post("/api/create-watermark", json={"position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Missing position: no issue if method ignores # (NB: must change intended_for or secret etc! Else integrity error.) resp = client.post("/api/create-watermark", json={"method": "overlay-watermark", "key": "key", "secret": "secret", "intended_for":"John", "id": 1}) &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:363: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1097 Integrity error during version insert for document 1: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b' for key 'uq_Versions_link'") [SQL: INSERT INTO Versions (documentid, link, intended_for, secret, method, position, path) VALUES (%(documentid)s, %(link)s, %(intended_for)s, %(secret)s, %(method)s, %(position)s, %(path)s) ] [parameters: {'documentid': 1, 'link': 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b', 'intended_for': 'Mickey Mouse', 'secret': 'secret', 'method': 'robust-xmp', 'position': 'metadata-only', 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username\\watermarks\\My File__Mickey_Mouse.pdf'}] (Background on this error at: https://sqlalche.me/e/20/gkpj) ERROR server:server.py:1007 Watermark applicability check failed for document 1: "Unknown watermarking method: 'watermarkmethod'. Known: ['overlay-watermark', 'robust-xmp', 'signed-annots']" WARNING server:server.py:972 Document not found or access denied for watermarking id=8 WARNING server:server.py:934 Missing document id in request WARNING server:server.py:948 Missing required fields for watermarking: {'id': 1, 'intended_for': 'Mickey Mouse', 'key': 'key', 'position': 'metadata-only', 'secret': 'secret'} ERROR server:server.py:1034 Watermarking failed for document 1 using method overlay-watermark: Missing recipient. (intended_for) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 1 failed, 13 passed, 22 warnings in 21.17s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2354"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2354_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2354_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2354_1"><button class="btn btn-outline-success"><span class="job_id">2354 : Job ID a8f2f0176c3844de85f6d767736fc0c8</span></button></div></a><div aria-labelledby="job_list___sub_heading_2354_1" data-parent="#job_list___sub_accordion_2354" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2354_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=105" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (105, 11), end pos: (105, 14)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -102,7 +102,7 @@ data, "Intended for: " + intended_for + "\nDo not disclose" ) - if not secret: + if secret: raise ValueError("Secret must be a non-empty string") if not isinstance(key, str) or not key: raise ValueError("Key must be a non-empty string")</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("id"), int) assert isinstance(data.get("documentid"), int) assert isinstance(data.get("link"), str) assert isinstance(data.get("intended_for"), str) assert isinstance(data.get("method"), str) assert isinstance(data.get("position"), str) assert isinstance(data.get("filename"), str) assert isinstance(data.get("size"), int) #check values assert data.get("documentid") == parameters["id"] assert data.get("intended_for") == parameters["intended_for"] assert data.get("method") == parameters["method"] assert data.get("position") == parameters["position"] #Tests with wrong parameters #Test with exact same call: should return database insertion error (Non unique entry) resp = client.post("/api/create-watermark", json=parameters) assert resp.status_code == 503 #Non existant method resp = client.post("/api/create-watermark", json={"method": "watermarkmethod", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Non existant document resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 8}) assert resp.status_code == 404 #Missing id resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"}) assert resp.status_code == 400 #Missing method resp = client.post("/api/create-watermark", json={"position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Missing position: no issue if method ignores # (NB: must change intended_for or secret etc! Else integrity error.) resp = client.post("/api/create-watermark", json={"method": "overlay-watermark", "key": "key", "secret": "secret", "intended_for":"John", "id": 1}) &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:363: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1097 Integrity error during version insert for document 1: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b' for key 'uq_Versions_link'") [SQL: INSERT INTO Versions (documentid, link, intended_for, secret, method, position, path) VALUES (%(documentid)s, %(link)s, %(intended_for)s, %(secret)s, %(method)s, %(position)s, %(path)s) ] [parameters: {'documentid': 1, 'link': 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b', 'intended_for': 'Mickey Mouse', 'secret': 'secret', 'method': 'robust-xmp', 'position': 'metadata-only', 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username\\watermarks\\My File__Mickey_Mouse.pdf'}] (Background on this error at: https://sqlalche.me/e/20/gkpj) ERROR server:server.py:1007 Watermark applicability check failed for document 1: "Unknown watermarking method: 'watermarkmethod'. Known: ['overlay-watermark', 'robust-xmp', 'signed-annots']" WARNING server:server.py:972 Document not found or access denied for watermarking id=8 WARNING server:server.py:934 Missing document id in request WARNING server:server.py:948 Missing required fields for watermarking: {'id': 1, 'intended_for': 'Mickey Mouse', 'key': 'key', 'position': 'metadata-only', 'secret': 'secret'} ERROR server:server.py:1034 Watermarking failed for document 1 using method overlay-watermark: Secret must be a non-empty string ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 1 failed, 13 passed, 22 warnings in 19.99s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2355"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2355_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2355_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2355_1"><button class="btn btn-outline-success"><span class="job_id">2355 : Job ID be23433b7f6948f896e904d7891c269c</span></button></div></a><div aria-labelledby="job_list___sub_heading_2355_1" data-parent="#job_list___sub_accordion_2355" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2355_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=107" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (107, 11), end pos: (107, 14)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -104,7 +104,7 @@ if not secret: raise ValueError("Secret must be a non-empty string") - if not isinstance(key, str) or not key: + if isinstance(key, str) or not key: raise ValueError("Key must be a non-empty string") # Add the "real" watermark by embedding the secret into</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T164844215132Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T164845091167Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.09s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2356"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2356_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2356_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2356_1"><button class="btn btn-outline-success"><span class="job_id">2356 : Job ID 991648f29bcb4d17878133439b9afaba</span></button></div></a><div aria-labelledby="job_list___sub_heading_2356_1" data-parent="#job_list___sub_accordion_2356" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2356_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=107" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (107, 39), end pos: (107, 42)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -104,7 +104,7 @@ if not secret: raise ValueError("Secret must be a non-empty string") - if not isinstance(key, str) or not key: + if not isinstance(key, str) or key: raise ValueError("Key must be a non-empty string") # Add the "real" watermark by embedding the secret into</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T174210930318Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T174211809167Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.15s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2357"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2357_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2357_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2357_1"><button class="btn btn-outline-success"><span class="job_id">2357 : Job ID e78fa5eb569144f1b4a1bca4d77ffc82</span></button></div></a><div aria-labelledby="job_list___sub_heading_2357_1" data-parent="#job_list___sub_accordion_2357" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2357_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=99" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (99, 11), end pos: (99, 27)</button></a></pre><pre>operator: core/AddNot, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -96,7 +96,7 @@ # Add a visible watermark. This might confuse the attackers, # suggesting that the only watermark is the visible watermark. # It also works as a deterrent against document diffusion. - if not intended_for: + if not not intended_for: raise ValueError("Missing recipient. (intended_for)") visibly_watermarked = self.visible_watermark( data, "Intended for: " + intended_for + "\nDo not disclose"</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("id"), int) assert isinstance(data.get("documentid"), int) assert isinstance(data.get("link"), str) assert isinstance(data.get("intended_for"), str) assert isinstance(data.get("method"), str) assert isinstance(data.get("position"), str) assert isinstance(data.get("filename"), str) assert isinstance(data.get("size"), int) #check values assert data.get("documentid") == parameters["id"] assert data.get("intended_for") == parameters["intended_for"] assert data.get("method") == parameters["method"] assert data.get("position") == parameters["position"] #Tests with wrong parameters #Test with exact same call: should return database insertion error (Non unique entry) resp = client.post("/api/create-watermark", json=parameters) assert resp.status_code == 503 #Non existant method resp = client.post("/api/create-watermark", json={"method": "watermarkmethod", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Non existant document resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 8}) assert resp.status_code == 404 #Missing id resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"}) assert resp.status_code == 400 #Missing method resp = client.post("/api/create-watermark", json={"position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Missing position: no issue if method ignores # (NB: must change intended_for or secret etc! Else integrity error.) resp = client.post("/api/create-watermark", json={"method": "overlay-watermark", "key": "key", "secret": "secret", "intended_for":"John", "id": 1}) &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:363: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1097 Integrity error during version insert for document 1: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b' for key 'uq_Versions_link'") [SQL: INSERT INTO Versions (documentid, link, intended_for, secret, method, position, path) VALUES (%(documentid)s, %(link)s, %(intended_for)s, %(secret)s, %(method)s, %(position)s, %(path)s) ] [parameters: {'documentid': 1, 'link': 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b', 'intended_for': 'Mickey Mouse', 'secret': 'secret', 'method': 'robust-xmp', 'position': 'metadata-only', 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username\\watermarks\\My File__Mickey_Mouse.pdf'}] (Background on this error at: https://sqlalche.me/e/20/gkpj) ERROR server:server.py:1007 Watermark applicability check failed for document 1: "Unknown watermarking method: 'watermarkmethod'. Known: ['overlay-watermark', 'robust-xmp', 'signed-annots']" WARNING server:server.py:972 Document not found or access denied for watermarking id=8 WARNING server:server.py:934 Missing document id in request WARNING server:server.py:948 Missing required fields for watermarking: {'id': 1, 'intended_for': 'Mickey Mouse', 'key': 'key', 'position': 'metadata-only', 'secret': 'secret'} ERROR server:server.py:1034 Watermarking failed for document 1 using method overlay-watermark: Missing recipient. (intended_for) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 1 failed, 13 passed, 22 warnings in 20.91s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2358"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2358_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2358_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2358_1"><button class="btn btn-outline-success"><span class="job_id">2358 : Job ID e6d2b750b10b4f6b80d4721046c1e939</span></button></div></a><div aria-labelledby="job_list___sub_heading_2358_1" data-parent="#job_list___sub_accordion_2358" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2358_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=105" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (105, 11), end pos: (105, 21)</button></a></pre><pre>operator: core/AddNot, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -102,7 +102,7 @@ data, "Intended for: " + intended_for + "\nDo not disclose" ) - if not secret: + if not not secret: raise ValueError("Secret must be a non-empty string") if not isinstance(key, str) or not key: raise ValueError("Key must be a non-empty string")</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("id"), int) assert isinstance(data.get("documentid"), int) assert isinstance(data.get("link"), str) assert isinstance(data.get("intended_for"), str) assert isinstance(data.get("method"), str) assert isinstance(data.get("position"), str) assert isinstance(data.get("filename"), str) assert isinstance(data.get("size"), int) #check values assert data.get("documentid") == parameters["id"] assert data.get("intended_for") == parameters["intended_for"] assert data.get("method") == parameters["method"] assert data.get("position") == parameters["position"] #Tests with wrong parameters #Test with exact same call: should return database insertion error (Non unique entry) resp = client.post("/api/create-watermark", json=parameters) assert resp.status_code == 503 #Non existant method resp = client.post("/api/create-watermark", json={"method": "watermarkmethod", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Non existant document resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 8}) assert resp.status_code == 404 #Missing id resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"}) assert resp.status_code == 400 #Missing method resp = client.post("/api/create-watermark", json={"position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Missing position: no issue if method ignores # (NB: must change intended_for or secret etc! Else integrity error.) resp = client.post("/api/create-watermark", json={"method": "overlay-watermark", "key": "key", "secret": "secret", "intended_for":"John", "id": 1}) &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:363: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1097 Integrity error during version insert for document 1: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b' for key 'uq_Versions_link'") [SQL: INSERT INTO Versions (documentid, link, intended_for, secret, method, position, path) VALUES (%(documentid)s, %(link)s, %(intended_for)s, %(secret)s, %(method)s, %(position)s, %(path)s) ] [parameters: {'documentid': 1, 'link': 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b', 'intended_for': 'Mickey Mouse', 'secret': 'secret', 'method': 'robust-xmp', 'position': 'metadata-only', 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username\\watermarks\\My File__Mickey_Mouse.pdf'}] (Background on this error at: https://sqlalche.me/e/20/gkpj) ERROR server:server.py:1007 Watermark applicability check failed for document 1: "Unknown watermarking method: 'watermarkmethod'. Known: ['overlay-watermark', 'robust-xmp', 'signed-annots']" WARNING server:server.py:972 Document not found or access denied for watermarking id=8 WARNING server:server.py:934 Missing document id in request WARNING server:server.py:948 Missing required fields for watermarking: {'id': 1, 'intended_for': 'Mickey Mouse', 'key': 'key', 'position': 'metadata-only', 'secret': 'secret'} ERROR server:server.py:1034 Watermarking failed for document 1 using method overlay-watermark: Secret must be a non-empty string ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 1 failed, 13 passed, 22 warnings in 20.62s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2359"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2359_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2359_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2359_1"><button class="btn btn-outline-success"><span class="job_id">2359 : Job ID a30eba54750747878d03de79c7b3292c</span></button></div></a><div aria-labelledby="job_list___sub_heading_2359_1" data-parent="#job_list___sub_accordion_2359" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2359_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=107" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (107, 11), end pos: (107, 46)</button></a></pre><pre>operator: core/AddNot, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -104,7 +104,7 @@ if not secret: raise ValueError("Secret must be a non-empty string") - if not isinstance(key, str) or not key: + if not not isinstance(key, str) or not key: raise ValueError("Key must be a non-empty string") # Add the "real" watermark by embedding the secret into</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("id"), int) assert isinstance(data.get("documentid"), int) assert isinstance(data.get("link"), str) assert isinstance(data.get("intended_for"), str) assert isinstance(data.get("method"), str) assert isinstance(data.get("position"), str) assert isinstance(data.get("filename"), str) assert isinstance(data.get("size"), int) #check values assert data.get("documentid") == parameters["id"] assert data.get("intended_for") == parameters["intended_for"] assert data.get("method") == parameters["method"] assert data.get("position") == parameters["position"] #Tests with wrong parameters #Test with exact same call: should return database insertion error (Non unique entry) resp = client.post("/api/create-watermark", json=parameters) assert resp.status_code == 503 #Non existant method resp = client.post("/api/create-watermark", json={"method": "watermarkmethod", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Non existant document resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 8}) assert resp.status_code == 404 #Missing id resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"}) assert resp.status_code == 400 #Missing method resp = client.post("/api/create-watermark", json={"position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Missing position: no issue if method ignores # (NB: must change intended_for or secret etc! Else integrity error.) resp = client.post("/api/create-watermark", json={"method": "overlay-watermark", "key": "key", "secret": "secret", "intended_for":"John", "id": 1}) &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:363: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1097 Integrity error during version insert for document 1: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b' for key 'uq_Versions_link'") [SQL: INSERT INTO Versions (documentid, link, intended_for, secret, method, position, path) VALUES (%(documentid)s, %(link)s, %(intended_for)s, %(secret)s, %(method)s, %(position)s, %(path)s) ] [parameters: {'documentid': 1, 'link': 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b', 'intended_for': 'Mickey Mouse', 'secret': 'secret', 'method': 'robust-xmp', 'position': 'metadata-only', 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username\\watermarks\\My File__Mickey_Mouse.pdf'}] (Background on this error at: https://sqlalche.me/e/20/gkpj) ERROR server:server.py:1007 Watermark applicability check failed for document 1: "Unknown watermarking method: 'watermarkmethod'. Known: ['overlay-watermark', 'robust-xmp', 'signed-annots']" WARNING server:server.py:972 Document not found or access denied for watermarking id=8 WARNING server:server.py:934 Missing document id in request WARNING server:server.py:948 Missing required fields for watermarking: {'id': 1, 'intended_for': 'Mickey Mouse', 'key': 'key', 'position': 'metadata-only', 'secret': 'secret'} ERROR server:server.py:1034 Watermarking failed for document 1 using method overlay-watermark: Key must be a non-empty string ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 1 failed, 13 passed, 22 warnings in 21.14s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2360"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2360_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2360_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2360_1"><button class="btn btn-outline-success"><span class="job_id">2360 : Job ID 9d3d8cbb1d0a498e8040a5ff90b8f9f0</span></button></div></a><div aria-labelledby="job_list___sub_heading_2360_1" data-parent="#job_list___sub_accordion_2360" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2360_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=153" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (153, 15), end pos: (153, 64)</button></a></pre><pre>operator: core/AddNot, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -150,7 +150,7 @@ for page in reader.pages: # Check for our custom structural watermark watermark_obj = page.get("/PieceInfo") - if watermark_obj and obfuscated_key in watermark_obj: + if not watermark_obj and obfuscated_key in watermark_obj: hidden = watermark_obj[obfuscated_key] # Extract string encrypted_str = str(hidden)</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%]</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2361"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2361_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2361_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2361_1"><button class="btn btn-outline-danger"><span class="job_id">2361 : Job ID 0e80234536fe4eaeac96804aadedc170</span></button></div></a><div aria-labelledby="job_list___sub_heading_2361_1" data-parent="#job_list___sub_accordion_2361" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2361_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=48" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (48, 24), end pos: (48, 28)</button></a></pre><pre>operator: core/ReplaceTrueWithFalse, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -45,7 +45,7 @@ rotate=0, fill=(0.6, 0.6, 0.6), # fill color (gray) color=(0, 0, 0), - overlay=True, + overlay=False, render_mode=2, # stroke + fill fill_opacity=0.5, stroke_opacity=0.5,</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.10s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2362"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2362_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2362_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2362_1"><button class="btn btn-outline-success"><span class="job_id">2362 : Job ID 9b890099554a4eec87db23e2245a65be</span></button></div></a><div aria-labelledby="job_list___sub_heading_2362_1" data-parent="#job_list___sub_accordion_2362" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2362_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=127" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (127, 15), end pos: (127, 19)</button></a></pre><pre>operator: core/ReplaceTrueWithFalse, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -124,7 +124,7 @@ pdf: PdfSource, position: str | None = None, ) -&gt; bool: - return True + return False @staticmethod def derive_fernet_key(password: str) -&gt; bytes:</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("id"), int) assert isinstance(data.get("documentid"), int) assert isinstance(data.get("link"), str) assert isinstance(data.get("intended_for"), str) assert isinstance(data.get("method"), str) assert isinstance(data.get("position"), str) assert isinstance(data.get("filename"), str) assert isinstance(data.get("size"), int) #check values assert data.get("documentid") == parameters["id"] assert data.get("intended_for") == parameters["intended_for"] assert data.get("method") == parameters["method"] assert data.get("position") == parameters["position"] #Tests with wrong parameters #Test with exact same call: should return database insertion error (Non unique entry) resp = client.post("/api/create-watermark", json=parameters) assert resp.status_code == 503 #Non existant method resp = client.post("/api/create-watermark", json={"method": "watermarkmethod", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Non existant document resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 8}) assert resp.status_code == 404 #Missing id resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"}) assert resp.status_code == 400 #Missing method resp = client.post("/api/create-watermark", json={"position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Missing position: no issue if method ignores # (NB: must change intended_for or secret etc! Else integrity error.) resp = client.post("/api/create-watermark", json={"method": "overlay-watermark", "key": "key", "secret": "secret", "intended_for":"John", "id": 1}) &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse streamed [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:363: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1097 Integrity error during version insert for document 1: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b' for key 'uq_Versions_link'") [SQL: INSERT INTO Versions (documentid, link, intended_for, secret, method, position, path) VALUES (%(documentid)s, %(link)s, %(intended_for)s, %(secret)s, %(method)s, %(position)s, %(path)s) ] [parameters: {'documentid': 1, 'link': 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b', 'intended_for': 'Mickey Mouse', 'secret': 'secret', 'method': 'robust-xmp', 'position': 'metadata-only', 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username\\watermarks\\My File__Mickey_Mouse.pdf'}] (Background on this error at: https://sqlalche.me/e/20/gkpj) ERROR server:server.py:1007 Watermark applicability check failed for document 1: "Unknown watermarking method: 'watermarkmethod'. Known: ['overlay-watermark', 'robust-xmp', 'signed-annots']" WARNING server:server.py:972 Document not found or access denied for watermarking id=8 WARNING server:server.py:934 Missing document id in request WARNING server:server.py:948 Missing required fields for watermarking: {'id': 1, 'intended_for': 'Mickey Mouse', 'key': 'key', 'position': 'metadata-only', 'secret': 'secret'} ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 1 failed, 13 passed, 22 warnings in 21.07s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2363"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2363_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2363_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2363_1"><button class="btn btn-outline-danger"><span class="job_id">2363 : Job ID 536578afe8ef4880837dcbb6c0d01994</span></button></div></a><div aria-labelledby="job_list___sub_heading_2363_1" data-parent="#job_list___sub_accordion_2363" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2363_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=153" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (153, 29), end pos: (153, 32)</button></a></pre><pre>operator: core/ReplaceAndWithOr, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -150,7 +150,7 @@ for page in reader.pages: # Check for our custom structural watermark watermark_obj = page.get("/PieceInfo") - if watermark_obj and obfuscated_key in watermark_obj: + if watermark_obj or obfuscated_key in watermark_obj: hidden = watermark_obj[obfuscated_key] # Extract string encrypted_str = str(hidden)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.03s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2364"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2364_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2364_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2364_1"><button class="btn btn-outline-danger"><span class="job_id">2364 : Job ID 9bad310e0c3643e2a7d67b2825fe5bce</span></button></div></a><div aria-labelledby="job_list___sub_heading_2364_1" data-parent="#job_list___sub_accordion_2364" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2364_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=77" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (77, 48), end pos: (77, 50)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -74,7 +74,7 @@ obfuscated_key = NameObject("/XObjD5fA2e1") for page in reader.pages: - piece_info = page.get("/PieceInfo") or DictionaryObject() + piece_info = page.get("/PieceInfo") and DictionaryObject() piece_info.update({obfuscated_key: create_string_object(hidden_data)}) page[NameObject("/PieceInfo")] = piece_info writer.add_page(page)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.18s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2365"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2365_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2365_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2365_1"><button class="btn btn-outline-success"><span class="job_id">2365 : Job ID 435bc3ff5d34445c9b150337604e7aea</span></button></div></a><div aria-labelledby="job_list___sub_heading_2365_1" data-parent="#job_list___sub_accordion_2365" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2365_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=107" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (107, 36), end pos: (107, 38)</button></a></pre><pre>operator: core/ReplaceOrWithAnd, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -104,7 +104,7 @@ if not secret: raise ValueError("Secret must be a non-empty string") - if not isinstance(key, str) or not key: + if not isinstance(key, str) and not key: raise ValueError("Key must be a non-empty string") # Add the "real" watermark by embedding the secret into</pre></div><div class="alert alert-secondary"><pre class="diff">...F.......... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:228: in open request = self._request_from_builder_args(args, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:200: in _request_from_builder_args return builder.get_request() ^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:764: in get_request return cls(self.get_environ()) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:688: in get_environ input_stream, content_length, boundary = stream_encode_multipart( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:130: in stream_encode_multipart write_binary(encoder.send_event(Data(data=chunk, more_data=True))) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:81: in write_binary return stream.write(s) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... 1 failed, 13 passed, 22 warnings in 21.52s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2366"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2366_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2366_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2366_1"><button class="btn btn-outline-danger"><span class="job_id">2366 : Job ID 6554420e3b024f3daf032dc8f76c249b</span></button></div></a><div aria-labelledby="job_list___sub_heading_2366_1" data-parent="#job_list___sub_accordion_2366" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2366_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=164" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (164, 23), end pos: (164, 35)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -161,7 +161,7 @@ fernet = Fernet(derived_key) decrypted = fernet.decrypt(encrypted_str.encode()).decode() extracted_data.append(decrypted) - except InvalidToken as e: + except CosmicRayTestingException as e: raise InvalidKeyError("Failed to decrypt watermark") from e else: extracted_data.append(None) # No watermark found on this page</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.53s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2367"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2367_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2367_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2367_1"><button class="btn btn-outline-danger"><span class="job_id">2367 : Job ID 32c5a7f3f86f405aaa55e6184b5bf655</span></button></div></a><div aria-labelledby="job_list___sub_heading_2367_1" data-parent="#job_list___sub_accordion_2367" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2367_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=42" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (42, 17), end pos: (42, 19)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -39,7 +39,7 @@ for page in doc: page.insert_text( - (72, 72), # Top-left corner (x, y) + ( 73, 72), # Top-left corner (x, y) visible_watermark, fontsize=18, rotate=0,</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.52s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2368"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2368_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2368_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2368_1"><button class="btn btn-outline-danger"><span class="job_id">2368 : Job ID 5274d1b2e8594873a7e4d37e78a11f10</span></button></div></a><div aria-labelledby="job_list___sub_heading_2368_1" data-parent="#job_list___sub_accordion_2368" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2368_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=42" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (42, 17), end pos: (42, 19)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -39,7 +39,7 @@ for page in doc: page.insert_text( - (72, 72), # Top-left corner (x, y) + ( 71, 72), # Top-left corner (x, y) visible_watermark, fontsize=18, rotate=0,</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.45s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2369"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2369_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2369_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2369_1"><button class="btn btn-outline-danger"><span class="job_id">2369 : Job ID 9aa452d563164e33a6adb04f69454316</span></button></div></a><div aria-labelledby="job_list___sub_heading_2369_1" data-parent="#job_list___sub_accordion_2369" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2369_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=42" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (42, 21), end pos: (42, 23)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -39,7 +39,7 @@ for page in doc: page.insert_text( - (72, 72), # Top-left corner (x, y) + (72, 73), # Top-left corner (x, y) visible_watermark, fontsize=18, rotate=0,</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.30s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2370"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2370_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2370_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2370_1"><button class="btn btn-outline-danger"><span class="job_id">2370 : Job ID 1b159b985b164255b1791821445aadbb</span></button></div></a><div aria-labelledby="job_list___sub_heading_2370_1" data-parent="#job_list___sub_accordion_2370" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2370_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=42" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (42, 21), end pos: (42, 23)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -39,7 +39,7 @@ for page in doc: page.insert_text( - (72, 72), # Top-left corner (x, y) + (72, 71), # Top-left corner (x, y) visible_watermark, fontsize=18, rotate=0,</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.33s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2371"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2371_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2371_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2371_1"><button class="btn btn-outline-danger"><span class="job_id">2371 : Job ID be7d027b6d5f46f5984b719c238cce2c</span></button></div></a><div aria-labelledby="job_list___sub_heading_2371_1" data-parent="#job_list___sub_accordion_2371" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2371_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=44" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (44, 25), end pos: (44, 27)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -41,7 +41,7 @@ page.insert_text( (72, 72), # Top-left corner (x, y) visible_watermark, - fontsize=18, + fontsize= 19, rotate=0, fill=(0.6, 0.6, 0.6), # fill color (gray) color=(0, 0, 0),</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.09s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2372"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2372_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2372_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2372_1"><button class="btn btn-outline-success"><span class="job_id">2372 : Job ID a46333811cfe4878a6e2c03ed00dc0d3</span></button></div></a><div aria-labelledby="job_list___sub_heading_2372_1" data-parent="#job_list___sub_accordion_2372" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2372_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=44" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (44, 25), end pos: (44, 27)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -41,7 +41,7 @@ page.insert_text( (72, 72), # Top-left corner (x, y) visible_watermark, - fontsize=18, + fontsize= 17, rotate=0, fill=(0.6, 0.6, 0.6), # fill color (gray) color=(0, 0, 0),</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e90a1a15266357174: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.67s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2373"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2373_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2373_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2373_1"><button class="btn btn-outline-success"><span class="job_id">2373 : Job ID 682a40872a284def9c2c7683dabb21a0</span></button></div></a><div aria-labelledby="job_list___sub_heading_2373_1" data-parent="#job_list___sub_accordion_2373" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2373_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=45" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (45, 23), end pos: (45, 24)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -42,7 +42,7 @@ (72, 72), # Top-left corner (x, y) visible_watermark, fontsize=18, - rotate=0, + rotate= 1, fill=(0.6, 0.6, 0.6), # fill color (gray) color=(0, 0, 0), overlay=True,</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e955345436d2b0801: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 20.77s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2374"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2374_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2374_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2374_1"><button class="btn btn-outline-success"><span class="job_id">2374 : Job ID 77fc7c6da3ca4d85b1223283e0836692</span></button></div></a><div aria-labelledby="job_list___sub_heading_2374_1" data-parent="#job_list___sub_accordion_2374" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2374_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=45" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (45, 23), end pos: (45, 24)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -42,7 +42,7 @@ (72, 72), # Top-left corner (x, y) visible_watermark, fontsize=18, - rotate=0, + rotate= -1, fill=(0.6, 0.6, 0.6), # fill color (gray) color=(0, 0, 0), overlay=True,</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T025935120547Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T025936028113Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.30s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2375"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2375_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2375_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2375_1"><button class="btn btn-outline-success"><span class="job_id">2375 : Job ID ad66e9947b0f4c74bcbd5f4ff144ffb3</span></button></div></a><div aria-labelledby="job_list___sub_heading_2375_1" data-parent="#job_list___sub_accordion_2375" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2375_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=46" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (46, 22), end pos: (46, 25)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 8</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -43,7 +43,7 @@ visible_watermark, fontsize=18, rotate=0, - fill=(0.6, 0.6, 0.6), # fill color (gray) + fill=( 1.6, 0.6, 0.6), # fill color (gray) color=(0, 0, 0), overlay=True, render_mode=2, # stroke + fill</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T151136131247Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T151137062456Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.31s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2376"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2376_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2376_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2376_1"><button class="btn btn-outline-success"><span class="job_id">2376 : Job ID 714de4c4b5f14c7e93b03992c68fc457</span></button></div></a><div aria-labelledby="job_list___sub_heading_2376_1" data-parent="#job_list___sub_accordion_2376" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2376_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=46" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (46, 22), end pos: (46, 25)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 9</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -43,7 +43,7 @@ visible_watermark, fontsize=18, rotate=0, - fill=(0.6, 0.6, 0.6), # fill color (gray) + fill=( -0.4, 0.6, 0.6), # fill color (gray) color=(0, 0, 0), overlay=True, render_mode=2, # stroke + fill</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("id"), int) assert isinstance(data.get("documentid"), int) assert isinstance(data.get("link"), str) assert isinstance(data.get("intended_for"), str) assert isinstance(data.get("method"), str) assert isinstance(data.get("position"), str) assert isinstance(data.get("filename"), str) assert isinstance(data.get("size"), int) #check values assert data.get("documentid") == parameters["id"] assert data.get("intended_for") == parameters["intended_for"] assert data.get("method") == parameters["method"] assert data.get("position") == parameters["position"] #Tests with wrong parameters #Test with exact same call: should return database insertion error (Non unique entry) resp = client.post("/api/create-watermark", json=parameters) assert resp.status_code == 503 #Non existant method resp = client.post("/api/create-watermark", json={"method": "watermarkmethod", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Non existant document resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 8}) assert resp.status_code == 404 #Missing id resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"}) assert resp.status_code == 400 #Missing method resp = client.post("/api/create-watermark", json={"position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Missing position: no issue if method ignores # (NB: must change intended_for or secret etc! Else integrity error.) resp = client.post("/api/create-watermark", json={"method": "overlay-watermark", "key": "key", "secret": "secret", "intended_for":"John", "id": 1}) &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:363: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1097 Integrity error during version insert for document 1: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b' for key 'uq_Versions_link'") [SQL: INSERT INTO Versions (documentid, link, intended_for, secret, method, position, path) VALUES (%(documentid)s, %(link)s, %(intended_for)s, %(secret)s, %(method)s, %(position)s, %(path)s) ] [parameters: {'documentid': 1, 'link': 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b', 'intended_for': 'Mickey Mouse', 'secret': 'secret', 'method': 'robust-xmp', 'position': 'metadata-only', 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username\\watermarks\\My File__Mickey_Mouse.pdf'}] (Background on this error at: https://sqlalche.me/e/20/gkpj) ERROR server:server.py:1007 Watermark applicability check failed for document 1: "Unknown watermarking method: 'watermarkmethod'. Known: ['overlay-watermark', 'robust-xmp', 'signed-annots']" WARNING server:server.py:972 Document not found or access denied for watermarking id=8 WARNING server:server.py:934 Missing document id in request WARNING server:server.py:948 Missing required fields for watermarking: {'id': 1, 'intended_for': 'Mickey Mouse', 'key': 'key', 'position': 'metadata-only', 'secret': 'secret'} ERROR server:server.py:1034 Watermarking failed for document 1 using method overlay-watermark: need 1, 3 or 4 color components in range 0 to 1 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 1 failed, 13 passed, 22 warnings in 20.89s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2377"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2377_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2377_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2377_1"><button class="btn btn-outline-success"><span class="job_id">2377 : Job ID eebc53e342634362acfbe5bf0acfb0eb</span></button></div></a><div aria-labelledby="job_list___sub_heading_2377_1" data-parent="#job_list___sub_accordion_2377" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2377_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=46" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (46, 27), end pos: (46, 30)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 10</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -43,7 +43,7 @@ visible_watermark, fontsize=18, rotate=0, - fill=(0.6, 0.6, 0.6), # fill color (gray) + fill=(0.6, 1.6, 0.6), # fill color (gray) color=(0, 0, 0), overlay=True, render_mode=2, # stroke + fill</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e88013685be8b2b50: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.80s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2378"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2378_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2378_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2378_1"><button class="btn btn-outline-success"><span class="job_id">2378 : Job ID 69cd384d4bbb4d548dd5db7777282c21</span></button></div></a><div aria-labelledby="job_list___sub_heading_2378_1" data-parent="#job_list___sub_accordion_2378" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2378_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=46" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (46, 27), end pos: (46, 30)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 11</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -43,7 +43,7 @@ visible_watermark, fontsize=18, rotate=0, - fill=(0.6, 0.6, 0.6), # fill color (gray) + fill=(0.6, -0.4, 0.6), # fill color (gray) color=(0, 0, 0), overlay=True, render_mode=2, # stroke + fill</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("id"), int) assert isinstance(data.get("documentid"), int) assert isinstance(data.get("link"), str) assert isinstance(data.get("intended_for"), str) assert isinstance(data.get("method"), str) assert isinstance(data.get("position"), str) assert isinstance(data.get("filename"), str) assert isinstance(data.get("size"), int) #check values assert data.get("documentid") == parameters["id"] assert data.get("intended_for") == parameters["intended_for"] assert data.get("method") == parameters["method"] assert data.get("position") == parameters["position"] #Tests with wrong parameters #Test with exact same call: should return database insertion error (Non unique entry) resp = client.post("/api/create-watermark", json=parameters) assert resp.status_code == 503 #Non existant method resp = client.post("/api/create-watermark", json={"method": "watermarkmethod", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Non existant document resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 8}) assert resp.status_code == 404 #Missing id resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"}) assert resp.status_code == 400 #Missing method resp = client.post("/api/create-watermark", json={"position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Missing position: no issue if method ignores # (NB: must change intended_for or secret etc! Else integrity error.) resp = client.post("/api/create-watermark", json={"method": "overlay-watermark", "key": "key", "secret": "secret", "intended_for":"John", "id": 1}) &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:363: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1097 Integrity error during version insert for document 1: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b' for key 'uq_Versions_link'") [SQL: INSERT INTO Versions (documentid, link, intended_for, secret, method, position, path) VALUES (%(documentid)s, %(link)s, %(intended_for)s, %(secret)s, %(method)s, %(position)s, %(path)s) ] [parameters: {'documentid': 1, 'link': 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b', 'intended_for': 'Mickey Mouse', 'secret': 'secret', 'method': 'robust-xmp', 'position': 'metadata-only', 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username\\watermarks\\My File__Mickey_Mouse.pdf'}] (Background on this error at: https://sqlalche.me/e/20/gkpj) ERROR server:server.py:1007 Watermark applicability check failed for document 1: "Unknown watermarking method: 'watermarkmethod'. Known: ['overlay-watermark', 'robust-xmp', 'signed-annots']" WARNING server:server.py:972 Document not found or access denied for watermarking id=8 WARNING server:server.py:934 Missing document id in request WARNING server:server.py:948 Missing required fields for watermarking: {'id': 1, 'intended_for': 'Mickey Mouse', 'key': 'key', 'position': 'metadata-only', 'secret': 'secret'} ERROR server:server.py:1034 Watermarking failed for document 1 using method overlay-watermark: need 1, 3 or 4 color components in range 0 to 1 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 1 failed, 13 passed, 22 warnings in 20.10s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2379"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2379_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2379_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2379_1"><button class="btn btn-outline-success"><span class="job_id">2379 : Job ID 8291299004e449f0a737a2d0452f6352</span></button></div></a><div aria-labelledby="job_list___sub_heading_2379_1" data-parent="#job_list___sub_accordion_2379" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2379_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=46" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (46, 32), end pos: (46, 35)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 12</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -43,7 +43,7 @@ visible_watermark, fontsize=18, rotate=0, - fill=(0.6, 0.6, 0.6), # fill color (gray) + fill=(0.6, 0.6, 1.6), # fill color (gray) color=(0, 0, 0), overlay=True, render_mode=2, # stroke + fill</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e74ebccdece3bc344: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.89s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2380"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2380_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2380_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2380_1"><button class="btn btn-outline-success"><span class="job_id">2380 : Job ID 616c5d06d9ae4746b6733198ef66ab9c</span></button></div></a><div aria-labelledby="job_list___sub_heading_2380_1" data-parent="#job_list___sub_accordion_2380" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2380_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=46" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (46, 32), end pos: (46, 35)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 13</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -43,7 +43,7 @@ visible_watermark, fontsize=18, rotate=0, - fill=(0.6, 0.6, 0.6), # fill color (gray) + fill=(0.6, 0.6, -0.4), # fill color (gray) color=(0, 0, 0), overlay=True, render_mode=2, # stroke + fill</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("id"), int) assert isinstance(data.get("documentid"), int) assert isinstance(data.get("link"), str) assert isinstance(data.get("intended_for"), str) assert isinstance(data.get("method"), str) assert isinstance(data.get("position"), str) assert isinstance(data.get("filename"), str) assert isinstance(data.get("size"), int) #check values assert data.get("documentid") == parameters["id"] assert data.get("intended_for") == parameters["intended_for"] assert data.get("method") == parameters["method"] assert data.get("position") == parameters["position"] #Tests with wrong parameters #Test with exact same call: should return database insertion error (Non unique entry) resp = client.post("/api/create-watermark", json=parameters) assert resp.status_code == 503 #Non existant method resp = client.post("/api/create-watermark", json={"method": "watermarkmethod", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Non existant document resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 8}) assert resp.status_code == 404 #Missing id resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"}) assert resp.status_code == 400 #Missing method resp = client.post("/api/create-watermark", json={"position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Missing position: no issue if method ignores # (NB: must change intended_for or secret etc! Else integrity error.) resp = client.post("/api/create-watermark", json={"method": "overlay-watermark", "key": "key", "secret": "secret", "intended_for":"John", "id": 1}) &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:363: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1097 Integrity error during version insert for document 1: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b' for key 'uq_Versions_link'") [SQL: INSERT INTO Versions (documentid, link, intended_for, secret, method, position, path) VALUES (%(documentid)s, %(link)s, %(intended_for)s, %(secret)s, %(method)s, %(position)s, %(path)s) ] [parameters: {'documentid': 1, 'link': 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b', 'intended_for': 'Mickey Mouse', 'secret': 'secret', 'method': 'robust-xmp', 'position': 'metadata-only', 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username\\watermarks\\My File__Mickey_Mouse.pdf'}] (Background on this error at: https://sqlalche.me/e/20/gkpj) ERROR server:server.py:1007 Watermark applicability check failed for document 1: "Unknown watermarking method: 'watermarkmethod'. Known: ['overlay-watermark', 'robust-xmp', 'signed-annots']" WARNING server:server.py:972 Document not found or access denied for watermarking id=8 WARNING server:server.py:934 Missing document id in request WARNING server:server.py:948 Missing required fields for watermarking: {'id': 1, 'intended_for': 'Mickey Mouse', 'key': 'key', 'position': 'metadata-only', 'secret': 'secret'} ERROR server:server.py:1034 Watermarking failed for document 1 using method overlay-watermark: need 1, 3 or 4 color components in range 0 to 1 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 1 failed, 13 passed, 22 warnings in 21.48s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2381"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2381_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2381_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2381_1"><button class="btn btn-outline-danger"><span class="job_id">2381 : Job ID 3b45f2355e94481aae48d4f67508cb3d</span></button></div></a><div aria-labelledby="job_list___sub_heading_2381_1" data-parent="#job_list___sub_accordion_2381" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2381_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=47" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (47, 23), end pos: (47, 24)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 14</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -44,7 +44,7 @@ fontsize=18, rotate=0, fill=(0.6, 0.6, 0.6), # fill color (gray) - color=(0, 0, 0), + color=( 1, 0, 0), overlay=True, render_mode=2, # stroke + fill fill_opacity=0.5,</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.12s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2382"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2382_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2382_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2382_1"><button class="btn btn-outline-success"><span class="job_id">2382 : Job ID c6277a6fb8f14d11b403444aa736600b</span></button></div></a><div aria-labelledby="job_list___sub_heading_2382_1" data-parent="#job_list___sub_accordion_2382" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2382_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=47" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (47, 23), end pos: (47, 24)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 15</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -44,7 +44,7 @@ fontsize=18, rotate=0, fill=(0.6, 0.6, 0.6), # fill color (gray) - color=(0, 0, 0), + color=( -1, 0, 0), overlay=True, render_mode=2, # stroke + fill fill_opacity=0.5,</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("id"), int) assert isinstance(data.get("documentid"), int) assert isinstance(data.get("link"), str) assert isinstance(data.get("intended_for"), str) assert isinstance(data.get("method"), str) assert isinstance(data.get("position"), str) assert isinstance(data.get("filename"), str) assert isinstance(data.get("size"), int) #check values assert data.get("documentid") == parameters["id"] assert data.get("intended_for") == parameters["intended_for"] assert data.get("method") == parameters["method"] assert data.get("position") == parameters["position"] #Tests with wrong parameters #Test with exact same call: should return database insertion error (Non unique entry) resp = client.post("/api/create-watermark", json=parameters) assert resp.status_code == 503 #Non existant method resp = client.post("/api/create-watermark", json={"method": "watermarkmethod", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Non existant document resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 8}) assert resp.status_code == 404 #Missing id resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"}) assert resp.status_code == 400 #Missing method resp = client.post("/api/create-watermark", json={"position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Missing position: no issue if method ignores # (NB: must change intended_for or secret etc! Else integrity error.) resp = client.post("/api/create-watermark", json={"method": "overlay-watermark", "key": "key", "secret": "secret", "intended_for":"John", "id": 1}) &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:363: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1097 Integrity error during version insert for document 1: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b' for key 'uq_Versions_link'") [SQL: INSERT INTO Versions (documentid, link, intended_for, secret, method, position, path) VALUES (%(documentid)s, %(link)s, %(intended_for)s, %(secret)s, %(method)s, %(position)s, %(path)s) ] [parameters: {'documentid': 1, 'link': 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b', 'intended_for': 'Mickey Mouse', 'secret': 'secret', 'method': 'robust-xmp', 'position': 'metadata-only', 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username\\watermarks\\My File__Mickey_Mouse.pdf'}] (Background on this error at: https://sqlalche.me/e/20/gkpj) ERROR server:server.py:1007 Watermark applicability check failed for document 1: "Unknown watermarking method: 'watermarkmethod'. Known: ['overlay-watermark', 'robust-xmp', 'signed-annots']" WARNING server:server.py:972 Document not found or access denied for watermarking id=8 WARNING server:server.py:934 Missing document id in request WARNING server:server.py:948 Missing required fields for watermarking: {'id': 1, 'intended_for': 'Mickey Mouse', 'key': 'key', 'position': 'metadata-only', 'secret': 'secret'} ERROR server:server.py:1034 Watermarking failed for document 1 using method overlay-watermark: need 1, 3 or 4 color components in range 0 to 1 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 1 failed, 13 passed, 22 warnings in 21.58s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2383"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2383_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2383_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2383_1"><button class="btn btn-outline-success"><span class="job_id">2383 : Job ID 1f8d52cb0efc452d8be0f8c9bfb492ab</span></button></div></a><div aria-labelledby="job_list___sub_heading_2383_1" data-parent="#job_list___sub_accordion_2383" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2383_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=47" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (47, 26), end pos: (47, 27)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 16</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -44,7 +44,7 @@ fontsize=18, rotate=0, fill=(0.6, 0.6, 0.6), # fill color (gray) - color=(0, 0, 0), + color=(0, 1, 0), overlay=True, render_mode=2, # stroke + fill fill_opacity=0.5,</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T002021825586Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T002022726138Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.57s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2384"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2384_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2384_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2384_1"><button class="btn btn-outline-success"><span class="job_id">2384 : Job ID d7a7d91091a04bed8b96f9fa57e67bc2</span></button></div></a><div aria-labelledby="job_list___sub_heading_2384_1" data-parent="#job_list___sub_accordion_2384" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2384_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=47" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (47, 26), end pos: (47, 27)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 17</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -44,7 +44,7 @@ fontsize=18, rotate=0, fill=(0.6, 0.6, 0.6), # fill color (gray) - color=(0, 0, 0), + color=(0, -1, 0), overlay=True, render_mode=2, # stroke + fill fill_opacity=0.5,</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T040258474221Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T040300414456Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ERROR server:rmap_handler.py:245 Failed to add source PDF to database: No users exist to own RMAP base document; create a user first ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 11 failed, 3 passed, 22 warnings in 24.12s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2385"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2385_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2385_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2385_1"><button class="btn btn-outline-danger"><span class="job_id">2385 : Job ID 7da0a4c748e2489ab39304e34ce3baec</span></button></div></a><div aria-labelledby="job_list___sub_heading_2385_1" data-parent="#job_list___sub_accordion_2385" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2385_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=47" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (47, 29), end pos: (47, 30)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 18</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -44,7 +44,7 @@ fontsize=18, rotate=0, fill=(0.6, 0.6, 0.6), # fill color (gray) - color=(0, 0, 0), + color=(0, 0, 1), overlay=True, render_mode=2, # stroke + fill fill_opacity=0.5,</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.49s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2386"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2386_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2386_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2386_1"><button class="btn btn-outline-success"><span class="job_id">2386 : Job ID 5dc19bdbacfe4d0b82cfc95563d299da</span></button></div></a><div aria-labelledby="job_list___sub_heading_2386_1" data-parent="#job_list___sub_accordion_2386" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2386_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=47" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (47, 29), end pos: (47, 30)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 19</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -44,7 +44,7 @@ fontsize=18, rotate=0, fill=(0.6, 0.6, 0.6), # fill color (gray) - color=(0, 0, 0), + color=(0, 0, -1), overlay=True, render_mode=2, # stroke + fill fill_opacity=0.5,</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("id"), int) assert isinstance(data.get("documentid"), int) assert isinstance(data.get("link"), str) assert isinstance(data.get("intended_for"), str) assert isinstance(data.get("method"), str) assert isinstance(data.get("position"), str) assert isinstance(data.get("filename"), str) assert isinstance(data.get("size"), int) #check values assert data.get("documentid") == parameters["id"] assert data.get("intended_for") == parameters["intended_for"] assert data.get("method") == parameters["method"] assert data.get("position") == parameters["position"] #Tests with wrong parameters #Test with exact same call: should return database insertion error (Non unique entry) resp = client.post("/api/create-watermark", json=parameters) assert resp.status_code == 503 #Non existant method resp = client.post("/api/create-watermark", json={"method": "watermarkmethod", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Non existant document resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 8}) assert resp.status_code == 404 #Missing id resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"}) assert resp.status_code == 400 #Missing method resp = client.post("/api/create-watermark", json={"position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Missing position: no issue if method ignores # (NB: must change intended_for or secret etc! Else integrity error.) resp = client.post("/api/create-watermark", json={"method": "overlay-watermark", "key": "key", "secret": "secret", "intended_for":"John", "id": 1}) &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:363: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1097 Integrity error during version insert for document 1: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b' for key 'uq_Versions_link'") [SQL: INSERT INTO Versions (documentid, link, intended_for, secret, method, position, path) VALUES (%(documentid)s, %(link)s, %(intended_for)s, %(secret)s, %(method)s, %(position)s, %(path)s) ] [parameters: {'documentid': 1, 'link': 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b', 'intended_for': 'Mickey Mouse', 'secret': 'secret', 'method': 'robust-xmp', 'position': 'metadata-only', 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username\\watermarks\\My File__Mickey_Mouse.pdf'}] (Background on this error at: https://sqlalche.me/e/20/gkpj) ERROR server:server.py:1007 Watermark applicability check failed for document 1: "Unknown watermarking method: 'watermarkmethod'. Known: ['overlay-watermark', 'robust-xmp', 'signed-annots']" WARNING server:server.py:972 Document not found or access denied for watermarking id=8 WARNING server:server.py:934 Missing document id in request WARNING server:server.py:948 Missing required fields for watermarking: {'id': 1, 'intended_for': 'Mickey Mouse', 'key': 'key', 'position': 'metadata-only', 'secret': 'secret'} ERROR server:server.py:1034 Watermarking failed for document 1 using method overlay-watermark: need 1, 3 or 4 color components in range 0 to 1 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 1 failed, 13 passed, 22 warnings in 20.23s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2387"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2387_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2387_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2387_1"><button class="btn btn-outline-danger"><span class="job_id">2387 : Job ID c1b98c6c477b481c8baf853e8ad8bf9c</span></button></div></a><div aria-labelledby="job_list___sub_heading_2387_1" data-parent="#job_list___sub_accordion_2387" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2387_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=49" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (49, 28), end pos: (49, 29)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 20</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -46,7 +46,7 @@ fill=(0.6, 0.6, 0.6), # fill color (gray) color=(0, 0, 0), overlay=True, - render_mode=2, # stroke + fill + render_mode= 3, # stroke + fill fill_opacity=0.5, stroke_opacity=0.5, )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.94s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2388"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2388_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2388_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2388_1"><button class="btn btn-outline-danger"><span class="job_id">2388 : Job ID a60acb23ef2b432f84308d21afa56175</span></button></div></a><div aria-labelledby="job_list___sub_heading_2388_1" data-parent="#job_list___sub_accordion_2388" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2388_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=49" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (49, 28), end pos: (49, 29)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 21</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -46,7 +46,7 @@ fill=(0.6, 0.6, 0.6), # fill color (gray) color=(0, 0, 0), overlay=True, - render_mode=2, # stroke + fill + render_mode= 1, # stroke + fill fill_opacity=0.5, stroke_opacity=0.5, )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.41s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2389"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2389_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2389_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2389_1"><button class="btn btn-outline-success"><span class="job_id">2389 : Job ID d17a5faa1bb74f3883c763fdaba5a94f</span></button></div></a><div aria-labelledby="job_list___sub_heading_2389_1" data-parent="#job_list___sub_accordion_2389" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2389_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=50" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (50, 29), end pos: (50, 32)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 22</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -47,7 +47,7 @@ color=(0, 0, 0), overlay=True, render_mode=2, # stroke + fill - fill_opacity=0.5, + fill_opacity= 1.5, stroke_opacity=0.5, ) </pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T162533531215Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T162534430053Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.35s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2390"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2390_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2390_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2390_1"><button class="btn btn-outline-danger"><span class="job_id">2390 : Job ID 21728576da11445f8e80ca9dd65c7763</span></button></div></a><div aria-labelledby="job_list___sub_heading_2390_1" data-parent="#job_list___sub_accordion_2390" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2390_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=50" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (50, 29), end pos: (50, 32)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 23</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -47,7 +47,7 @@ color=(0, 0, 0), overlay=True, render_mode=2, # stroke + fill - fill_opacity=0.5, + fill_opacity= -0.5, stroke_opacity=0.5, ) </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.72s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2391"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2391_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2391_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2391_1"><button class="btn btn-outline-success"><span class="job_id">2391 : Job ID 3732d14597bd452195f45cfef4ac1bee</span></button></div></a><div aria-labelledby="job_list___sub_heading_2391_1" data-parent="#job_list___sub_accordion_2391" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2391_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=51" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (51, 31), end pos: (51, 34)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 24</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -48,7 +48,7 @@ overlay=True, render_mode=2, # stroke + fill fill_opacity=0.5, - stroke_opacity=0.5, + stroke_opacity= 1.5, ) output_stream = BytesIO()</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T191046926459Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T191047806856Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.59s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2392"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2392_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2392_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2392_1"><button class="btn btn-outline-success"><span class="job_id">2392 : Job ID 1cab11e0600043abad6a9096c244c4f1</span></button></div></a><div aria-labelledby="job_list___sub_heading_2392_1" data-parent="#job_list___sub_accordion_2392" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2392_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=51" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (51, 31), end pos: (51, 34)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 25</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -48,7 +48,7 @@ overlay=True, render_mode=2, # stroke + fill fill_opacity=0.5, - stroke_opacity=0.5, + stroke_opacity= -0.5, ) output_stream = BytesIO()</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%]</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2393"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2393_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2393_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2393_1"><button class="btn btn-outline-success"><span class="job_id">2393 : Job ID 1e276fc0e6bb4059859de1840e4d381e</span></button></div></a><div aria-labelledby="job_list___sub_heading_2393_1" data-parent="#job_list___sub_accordion_2393" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2393_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=57" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (57, 27), end pos: (57, 28)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 26</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -54,7 +54,7 @@ output_stream = BytesIO() doc.save(output_stream) doc.close() - output_stream.seek(0) + output_stream.seek( 1) return output_stream.read() @staticmethod</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T173148131419Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T173148996860Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.47s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2394"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2394_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2394_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2394_1"><button class="btn btn-outline-success"><span class="job_id">2394 : Job ID 725e0aa0c2a24c598a545a8e9e7ae973</span></button></div></a><div aria-labelledby="job_list___sub_heading_2394_1" data-parent="#job_list___sub_accordion_2394" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2394_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=57" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (57, 27), end pos: (57, 28)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 27</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -54,7 +54,7 @@ output_stream = BytesIO() doc.save(output_stream) doc.close() - output_stream.seek(0) + output_stream.seek( -1) return output_stream.read() @staticmethod</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("id"), int) assert isinstance(data.get("documentid"), int) assert isinstance(data.get("link"), str) assert isinstance(data.get("intended_for"), str) assert isinstance(data.get("method"), str) assert isinstance(data.get("position"), str) assert isinstance(data.get("filename"), str) assert isinstance(data.get("size"), int) #check values assert data.get("documentid") == parameters["id"] assert data.get("intended_for") == parameters["intended_for"] assert data.get("method") == parameters["method"] assert data.get("position") == parameters["position"] #Tests with wrong parameters #Test with exact same call: should return database insertion error (Non unique entry) resp = client.post("/api/create-watermark", json=parameters) assert resp.status_code == 503 #Non existant method resp = client.post("/api/create-watermark", json={"method": "watermarkmethod", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Non existant document resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 8}) assert resp.status_code == 404 #Missing id resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"}) assert resp.status_code == 400 #Missing method resp = client.post("/api/create-watermark", json={"position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Missing position: no issue if method ignores # (NB: must change intended_for or secret etc! Else integrity error.) resp = client.post("/api/create-watermark", json={"method": "overlay-watermark", "key": "key", "secret": "secret", "intended_for":"John", "id": 1}) &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:363: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1097 Integrity error during version insert for document 1: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b' for key 'uq_Versions_link'") [SQL: INSERT INTO Versions (documentid, link, intended_for, secret, method, position, path) VALUES (%(documentid)s, %(link)s, %(intended_for)s, %(secret)s, %(method)s, %(position)s, %(path)s) ] [parameters: {'documentid': 1, 'link': 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b', 'intended_for': 'Mickey Mouse', 'secret': 'secret', 'method': 'robust-xmp', 'position': 'metadata-only', 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username\\watermarks\\My File__Mickey_Mouse.pdf'}] (Background on this error at: https://sqlalche.me/e/20/gkpj) ERROR server:server.py:1007 Watermark applicability check failed for document 1: "Unknown watermarking method: 'watermarkmethod'. Known: ['overlay-watermark', 'robust-xmp', 'signed-annots']" WARNING server:server.py:972 Document not found or access denied for watermarking id=8 WARNING server:server.py:934 Missing document id in request WARNING server:server.py:948 Missing required fields for watermarking: {'id': 1, 'intended_for': 'Mickey Mouse', 'key': 'key', 'position': 'metadata-only', 'secret': 'secret'} ERROR server:server.py:1034 Watermarking failed for document 1 using method overlay-watermark: negative seek value -1 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 1 failed, 13 passed, 22 warnings in 20.15s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2395"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2395_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2395_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2395_1"><button class="btn btn-outline-danger"><span class="job_id">2395 : Job ID efaf54a228e9422fbaeea8e081838ad1</span></button></div></a><div aria-labelledby="job_list___sub_heading_2395_1" data-parent="#job_list___sub_accordion_2395" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2395_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=84" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (84, 27), end pos: (84, 28)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 28</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -81,7 +81,7 @@ output_stream = BytesIO() writer.write(output_stream) - output_stream.seek(0) + output_stream.seek( 1) return output_stream.read() def add_watermark(</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.39s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2396"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2396_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2396_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2396_1"><button class="btn btn-outline-success"><span class="job_id">2396 : Job ID e1712f7566e649d0a08b9e24e4cdfc8e</span></button></div></a><div aria-labelledby="job_list___sub_heading_2396_1" data-parent="#job_list___sub_accordion_2396" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2396_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=84" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (84, 27), end pos: (84, 28)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 29</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -81,7 +81,7 @@ output_stream = BytesIO() writer.write(output_stream) - output_stream.seek(0) + output_stream.seek( -1) return output_stream.read() def add_watermark(</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("id"), int) assert isinstance(data.get("documentid"), int) assert isinstance(data.get("link"), str) assert isinstance(data.get("intended_for"), str) assert isinstance(data.get("method"), str) assert isinstance(data.get("position"), str) assert isinstance(data.get("filename"), str) assert isinstance(data.get("size"), int) #check values assert data.get("documentid") == parameters["id"] assert data.get("intended_for") == parameters["intended_for"] assert data.get("method") == parameters["method"] assert data.get("position") == parameters["position"] #Tests with wrong parameters #Test with exact same call: should return database insertion error (Non unique entry) resp = client.post("/api/create-watermark", json=parameters) assert resp.status_code == 503 #Non existant method resp = client.post("/api/create-watermark", json={"method": "watermarkmethod", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Non existant document resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 8}) assert resp.status_code == 404 #Missing id resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"}) assert resp.status_code == 400 #Missing method resp = client.post("/api/create-watermark", json={"position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Missing position: no issue if method ignores # (NB: must change intended_for or secret etc! Else integrity error.) resp = client.post("/api/create-watermark", json={"method": "overlay-watermark", "key": "key", "secret": "secret", "intended_for":"John", "id": 1}) &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:363: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1097 Integrity error during version insert for document 1: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b' for key 'uq_Versions_link'") [SQL: INSERT INTO Versions (documentid, link, intended_for, secret, method, position, path) VALUES (%(documentid)s, %(link)s, %(intended_for)s, %(secret)s, %(method)s, %(position)s, %(path)s) ] [parameters: {'documentid': 1, 'link': 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b', 'intended_for': 'Mickey Mouse', 'secret': 'secret', 'method': 'robust-xmp', 'position': 'metadata-only', 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username\\watermarks\\My File__Mickey_Mouse.pdf'}] (Background on this error at: https://sqlalche.me/e/20/gkpj) ERROR server:server.py:1007 Watermark applicability check failed for document 1: "Unknown watermarking method: 'watermarkmethod'. Known: ['overlay-watermark', 'robust-xmp', 'signed-annots']" WARNING server:server.py:972 Document not found or access denied for watermarking id=8 WARNING server:server.py:934 Missing document id in request WARNING server:server.py:948 Missing required fields for watermarking: {'id': 1, 'intended_for': 'Mickey Mouse', 'key': 'key', 'position': 'metadata-only', 'secret': 'secret'} ERROR server:server.py:1034 Watermarking failed for document 1 using method overlay-watermark: negative seek value -1 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 1 failed, 13 passed, 22 warnings in 20.69s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2397"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2397_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2397_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2397_1"><button class="btn btn-outline-success"><span class="job_id">2397 : Job ID a360ffa391d44d249d9068c3c41d7309</span></button></div></a><div aria-labelledby="job_list___sub_heading_2397_1" data-parent="#job_list___sub_accordion_2397" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2397_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=136" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (136, 19), end pos: (136, 21)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 30</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -133,7 +133,7 @@ """ kdf = PBKDF2HMAC( algorithm=hashes.SHA256(), - length=32, + length= 33, salt=b"try_and_break_me", iterations=200_000, backend=default_backend(),</pre></div><div class="alert alert-secondary"><pre class="diff">.........FF... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("id"), int) assert isinstance(data.get("documentid"), int) assert isinstance(data.get("link"), str) assert isinstance(data.get("intended_for"), str) assert isinstance(data.get("method"), str) assert isinstance(data.get("position"), str) assert isinstance(data.get("filename"), str) assert isinstance(data.get("size"), int) #check values assert data.get("documentid") == parameters["id"] assert data.get("intended_for") == parameters["intended_for"] assert data.get("method") == parameters["method"] assert data.get("position") == parameters["position"] #Tests with wrong parameters #Test with exact same call: should return database insertion error (Non unique entry) resp = client.post("/api/create-watermark", json=parameters) assert resp.status_code == 503 #Non existant method resp = client.post("/api/create-watermark", json={"method": "watermarkmethod", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Non existant document resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 8}) assert resp.status_code == 404 #Missing id resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"}) assert resp.status_code == 400 #Missing method resp = client.post("/api/create-watermark", json={"position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Missing position: no issue if method ignores # (NB: must change intended_for or secret etc! Else integrity error.) resp = client.post("/api/create-watermark", json={"method": "overlay-watermark", "key": "key", "secret": "secret", "intended_for":"John", "id": 1}) &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:363: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1097 Integrity error during version insert for document 1: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b' for key 'uq_Versions_link'") [SQL: INSERT INTO Versions (documentid, link, intended_for, secret, method, position, path) VALUES (%(documentid)s, %(link)s, %(intended_for)s, %(secret)s, %(method)s, %(position)s, %(path)s) ] [parameters: {'documentid': 1, 'link': 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b', 'intended_for': 'Mickey Mouse', 'secret': 'secret', 'method': 'robust-xmp', 'position': 'metadata-only', 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username\\watermarks\\My File__Mickey_Mouse.pdf'}] (Background on this error at: https://sqlalche.me/e/20/gkpj) ERROR server:server.py:1007 Watermark applicability check failed for document 1: "Unknown watermarking method: 'watermarkmethod'. Known: ['overlay-watermark', 'robust-xmp', 'signed-annots']" WARNING server:server.py:972 Document not found or access denied for watermarking id=8 WARNING server:server.py:934 Missing document id in request WARNING server:server.py:948 Missing required fields for watermarking: {'id': 1, 'intended_for': 'Mickey Mouse', 'key': 'key', 'position': 'metadata-only', 'secret': 'secret'} ERROR server:server.py:1034 Watermarking failed for document 1 using method overlay-watermark: Fernet key must be 32 url-safe base64-encoded bytes. __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 52 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:400: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1226 Error when attempting to read watermark for document 2: Fernet key must be 32 url-safe base64-encoded bytes. ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 2 failed, 12 passed, 22 warnings in 20.40s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2398"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2398_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2398_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2398_1"><button class="btn btn-outline-success"><span class="job_id">2398 : Job ID 43b7c0933c4b4f29b473fc2d4c4ffacc</span></button></div></a><div aria-labelledby="job_list___sub_heading_2398_1" data-parent="#job_list___sub_accordion_2398" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2398_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=136" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (136, 19), end pos: (136, 21)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 31</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -133,7 +133,7 @@ """ kdf = PBKDF2HMAC( algorithm=hashes.SHA256(), - length=32, + length= 31, salt=b"try_and_break_me", iterations=200_000, backend=default_backend(),</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ea087d653d2b2e136: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.81s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2399"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2399_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2399_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2399_1"><button class="btn btn-outline-success"><span class="job_id">2399 : Job ID cfb2b5aa71e54da6ae795e4ebf0a44bf</span></button></div></a><div aria-labelledby="job_list___sub_heading_2399_1" data-parent="#job_list___sub_accordion_2399" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2399_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=138" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (138, 23), end pos: (138, 30)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 32</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -135,7 +135,7 @@ algorithm=hashes.SHA256(), length=32, salt=b"try_and_break_me", - iterations=200_000, + iterations= 200001, backend=default_backend(), ) return base64.urlsafe_b64encode(kdf.derive(password.encode()))</pre></div><div class="alert alert-secondary"><pre class="diff">..........F... [100%] ================================== FAILURES =================================== __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 52 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:400: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1226 Error when attempting to read watermark for document 2: Failed to decrypt watermark ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 1 failed, 13 passed, 22 warnings in 19.98s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2400"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2400_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2400_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2400_1"><button class="btn btn-outline-success"><span class="job_id">2400 : Job ID 46a2e85ce09d4ee195f692101ad5b76b</span></button></div></a><div aria-labelledby="job_list___sub_heading_2400_1" data-parent="#job_list___sub_accordion_2400" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2400_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=138" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (138, 23), end pos: (138, 30)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 33</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -135,7 +135,7 @@ algorithm=hashes.SHA256(), length=32, salt=b"try_and_break_me", - iterations=200_000, + iterations= 199999, backend=default_backend(), ) return base64.urlsafe_b64encode(kdf.derive(password.encode()))</pre></div><div class="alert alert-secondary"><pre class="diff">...F......F... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:228: in open request = self._request_from_builder_args(args, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:200: in _request_from_builder_args return builder.get_request() ^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:764: in get_request return cls(self.get_environ()) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:688: in get_environ input_stream, content_length, boundary = stream_encode_multipart( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:130: in stream_encode_multipart write_binary(encoder.send_event(Data(data=chunk, more_data=True))) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:81: in write_binary return stream.write(s) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 52 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:400: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1226 Error when attempting to read watermark for document 2: Failed to decrypt watermark ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 2 failed, 12 passed, 22 warnings in 20.88s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2401"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2401_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2401_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2401_1"><button class="btn btn-outline-danger"><span class="job_id">2401 : Job ID fcea3163b2ec4b97b80847d74b51c852</span></button></div></a><div aria-labelledby="job_list___sub_heading_2401_1" data-parent="#job_list___sub_accordion_2401" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2401_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=169" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (169, 34), end pos: (169, 35)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 34</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -166,5 +166,5 @@ else: extracted_data.append(None) # No watermark found on this page - return str(extracted_data[0]) + return str(extracted_data[ 1]) </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.40s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2402"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2402_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2402_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2402_1"><button class="btn btn-outline-success"><span class="job_id">2402 : Job ID df3956d7ccb548c6b6a8e74265d58b78</span></button></div></a><div aria-labelledby="job_list___sub_heading_2402_1" data-parent="#job_list___sub_accordion_2402" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2402_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=169" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (169, 34), end pos: (169, 35)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 35</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -166,5 +166,5 @@ else: extracted_data.append(None) # No watermark found on this page - return str(extracted_data[0]) + return str(extracted_data[ -1]) </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T033049774370Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T033050675564Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.47s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2403"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2403_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2403_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2403_1"><button class="btn btn-outline-success"><span class="job_id">2403 : Job ID 7d6b11e68c954cab90bd11139420b5d7</span></button></div></a><div aria-labelledby="job_list___sub_heading_2403_1" data-parent="#job_list___sub_accordion_2403" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2403_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=27" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (27, 4), end pos: (28, 0)</button></a></pre><pre>operator: core/RemoveDecorator, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -23,8 +23,6 @@ class StructuralOverlay(WatermarkingMethod): name = "overlay-watermark" - - @staticmethod def get_usage() -&gt; str: return "Method that overlays a visible watermark." </pre></div><div class="alert alert-secondary"><pre class="diff">........F..... [100%] ================================== FAILURES =================================== _____________________ test_get_watermarking_methods_route _____________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_watermarking_methods_route(client): """Test get watermarking methods endpoint.""" &gt; resp = client.get("/api/get-watermarking-methods") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:297: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1162: in get return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.get("/api/get-watermarking-methods") def get_watermarking_methods(): methods = [] for m in WMUtils.METHODS: methods.append( &gt; {"name": m, "description": WMUtils.get_method(m).get_usage()} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) E TypeError: StructuralOverlay.get_usage() takes 0 positional arguments but 1 was given server.py:1137: TypeError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_get_watermarking_methods_route - TypeError: ... 1 failed, 13 passed, 22 warnings in 21.00s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2404"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2404_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2404_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2404_1"><button class="btn btn-outline-success"><span class="job_id">2404 : Job ID d15bda8411e646e6be2fc75af22d95c0</span></button></div></a><div aria-labelledby="job_list___sub_heading_2404_1" data-parent="#job_list___sub_accordion_2404" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2404_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=31" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (31, 4), end pos: (32, 0)</button></a></pre><pre>operator: core/RemoveDecorator, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -27,8 +27,6 @@ @staticmethod def get_usage() -&gt; str: return "Method that overlays a visible watermark." - - @staticmethod def visible_watermark(pdf_bytes: bytes, visible_watermark: str): """ Applies a visible watermark to each page of a PDF (in-memory).</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T044040709555Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T044041710215Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.72s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2405"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2405_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2405_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2405_1"><button class="btn btn-outline-success"><span class="job_id">2405 : Job ID aad698d8e37546e4b7f37d41b2b65c3f</span></button></div></a><div aria-labelledby="job_list___sub_heading_2405_1" data-parent="#job_list___sub_accordion_2405" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2405_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=60" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (60, 4), end pos: (61, 0)</button></a></pre><pre>operator: core/RemoveDecorator, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -56,8 +56,6 @@ doc.close() output_stream.seek(0) return output_stream.read() - - @staticmethod def structural_watermark(pdf_bytes: bytes, hidden_data: str) -&gt; bytes: """ Adds a hidden structural watermark to the PDF (in-memory).</pre></div><div class="alert alert-secondary"><pre class="diff">.........F.... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("id"), int) assert isinstance(data.get("documentid"), int) assert isinstance(data.get("link"), str) assert isinstance(data.get("intended_for"), str) assert isinstance(data.get("method"), str) assert isinstance(data.get("position"), str) assert isinstance(data.get("filename"), str) assert isinstance(data.get("size"), int) #check values assert data.get("documentid") == parameters["id"] assert data.get("intended_for") == parameters["intended_for"] assert data.get("method") == parameters["method"] assert data.get("position") == parameters["position"] #Tests with wrong parameters #Test with exact same call: should return database insertion error (Non unique entry) resp = client.post("/api/create-watermark", json=parameters) assert resp.status_code == 503 #Non existant method resp = client.post("/api/create-watermark", json={"method": "watermarkmethod", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Non existant document resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 8}) assert resp.status_code == 404 #Missing id resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"}) assert resp.status_code == 400 #Missing method resp = client.post("/api/create-watermark", json={"position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Missing position: no issue if method ignores # (NB: must change intended_for or secret etc! Else integrity error.) resp = client.post("/api/create-watermark", json={"method": "overlay-watermark", "key": "key", "secret": "secret", "intended_for":"John", "id": 1}) &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:363: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1097 Integrity error during version insert for document 1: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b' for key 'uq_Versions_link'") [SQL: INSERT INTO Versions (documentid, link, intended_for, secret, method, position, path) VALUES (%(documentid)s, %(link)s, %(intended_for)s, %(secret)s, %(method)s, %(position)s, %(path)s) ] [parameters: {'documentid': 1, 'link': 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b', 'intended_for': 'Mickey Mouse', 'secret': 'secret', 'method': 'robust-xmp', 'position': 'metadata-only', 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username\\watermarks\\My File__Mickey_Mouse.pdf'}] (Background on this error at: https://sqlalche.me/e/20/gkpj) ERROR server:server.py:1007 Watermark applicability check failed for document 1: "Unknown watermarking method: 'watermarkmethod'. Known: ['overlay-watermark', 'robust-xmp', 'signed-annots']" WARNING server:server.py:972 Document not found or access denied for watermarking id=8 WARNING server:server.py:934 Missing document id in request WARNING server:server.py:948 Missing required fields for watermarking: {'id': 1, 'intended_for': 'Mickey Mouse', 'key': 'key', 'position': 'metadata-only', 'secret': 'secret'} ERROR server:server.py:1034 Watermarking failed for document 1 using method overlay-watermark: StructuralOverlay.structural_watermark() takes 2 positional arguments but 3 were given ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 1 failed, 13 passed, 22 warnings in 20.34s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2406"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2406_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2406_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2406_1"><button class="btn btn-outline-success"><span class="job_id">2406 : Job ID 78c6e40595724a1f8db8c493a7fd5576</span></button></div></a><div aria-labelledby="job_list___sub_heading_2406_1" data-parent="#job_list___sub_accordion_2406" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2406_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=129" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (129, 4), end pos: (130, 0)</button></a></pre><pre>operator: core/RemoveDecorator, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -125,8 +125,6 @@ position: str | None = None, ) -&gt; bool: return True - - @staticmethod def derive_fernet_key(password: str) -&gt; bytes: """ Derive a Fernet-compatible key from a string password using PBKDF2.</pre></div><div class="alert alert-secondary"><pre class="diff">.........FF... [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(data.get("id"), int) assert isinstance(data.get("documentid"), int) assert isinstance(data.get("link"), str) assert isinstance(data.get("intended_for"), str) assert isinstance(data.get("method"), str) assert isinstance(data.get("position"), str) assert isinstance(data.get("filename"), str) assert isinstance(data.get("size"), int) #check values assert data.get("documentid") == parameters["id"] assert data.get("intended_for") == parameters["intended_for"] assert data.get("method") == parameters["method"] assert data.get("position") == parameters["position"] #Tests with wrong parameters #Test with exact same call: should return database insertion error (Non unique entry) resp = client.post("/api/create-watermark", json=parameters) assert resp.status_code == 503 #Non existant method resp = client.post("/api/create-watermark", json={"method": "watermarkmethod", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Non existant document resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 8}) assert resp.status_code == 404 #Missing id resp = client.post("/api/create-watermark", json={"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"}) assert resp.status_code == 400 #Missing method resp = client.post("/api/create-watermark", json={"position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1}) assert resp.status_code == 400 #Missing position: no issue if method ignores # (NB: must change intended_for or secret etc! Else integrity error.) resp = client.post("/api/create-watermark", json={"method": "overlay-watermark", "key": "key", "secret": "secret", "intended_for":"John", "id": 1}) &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:363: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1097 Integrity error during version insert for document 1: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b' for key 'uq_Versions_link'") [SQL: INSERT INTO Versions (documentid, link, intended_for, secret, method, position, path) VALUES (%(documentid)s, %(link)s, %(intended_for)s, %(secret)s, %(method)s, %(position)s, %(path)s) ] [parameters: {'documentid': 1, 'link': 'b844de8060c148285cdf347927f723d01bd81b35ea64b58b7494157eba1a274b', 'intended_for': 'Mickey Mouse', 'secret': 'secret', 'method': 'robust-xmp', 'position': 'metadata-only', 'path': 'C:\\Users\\franc\\Documents\\GitHub\\softsec-tatou\\server\\src\\storage\\files\\username\\watermarks\\My File__Mickey_Mouse.pdf'}] (Background on this error at: https://sqlalche.me/e/20/gkpj) ERROR server:server.py:1007 Watermark applicability check failed for document 1: "Unknown watermarking method: 'watermarkmethod'. Known: ['overlay-watermark', 'robust-xmp', 'signed-annots']" WARNING server:server.py:972 Document not found or access denied for watermarking id=8 WARNING server:server.py:934 Missing document id in request WARNING server:server.py:948 Missing required fields for watermarking: {'id': 1, 'intended_for': 'Mickey Mouse', 'key': 'key', 'position': 'metadata-only', 'secret': 'secret'} ERROR server:server.py:1034 Watermarking failed for document 1 using method overlay-watermark: StructuralOverlay.derive_fernet_key() takes 1 positional argument but 2 were given __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 52 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:400: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1226 Error when attempting to read watermark for document 2: StructuralOverlay.derive_fernet_key() takes 1 positional argument but 2 were given ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 2 failed, 12 passed, 22 warnings in 20.35s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2407"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2407_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2407_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2407_1"><button class="btn btn-outline-danger"><span class="job_id">2407 : Job ID be73c49c3bb2433d8d3b9c515f8b4a5e</span></button></div></a><div aria-labelledby="job_list___sub_heading_2407_1" data-parent="#job_list___sub_accordion_2407" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2407_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=40" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (40, 20), end pos: (40, 23)</button></a></pre><pre>operator: core/ZeroIterationForLoop, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -37,7 +37,7 @@ input_stream = BytesIO(pdf_bytes) doc = fitz.open(stream=input_stream, filetype="pdf") - for page in doc: + for page in []: page.insert_text( (72, 72), # Top-left corner (x, y) visible_watermark,</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.31s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2408"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2408_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2408_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2408_1"><button class="btn btn-outline-danger"><span class="job_id">2408 : Job ID 0d1eedad3a8449a9920bbefb9ed6374b</span></button></div></a><div aria-labelledby="job_list___sub_heading_2408_1" data-parent="#job_list___sub_accordion_2408" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2408_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=76" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (76, 20), end pos: (76, 32)</button></a></pre><pre>operator: core/ZeroIterationForLoop, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -73,7 +73,7 @@ # Obfuscated name makes it less obvious than "/Watermark" obfuscated_key = NameObject("/XObjD5fA2e1") - for page in reader.pages: + for page in []: piece_info = page.get("/PieceInfo") or DictionaryObject() piece_info.update({obfuscated_key: create_string_object(hidden_data)}) page[NameObject("/PieceInfo")] = piece_info</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.67s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2409"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2409_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2409_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2409_1"><button class="btn btn-outline-success"><span class="job_id">2409 : Job ID 833e64aaca744050ba592b36fd52e4c1</span></button></div></a><div aria-labelledby="job_list___sub_heading_2409_1" data-parent="#job_list___sub_accordion_2409" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2409_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=structural_and_overlay_watermark.py&amp;line=150" class="text-secondary"><button class="btn btn-outline-dark">structural_and_overlay_watermark.py, start pos: (150, 20), end pos: (150, 32)</button></a></pre><pre>operator: core/ZeroIterationForLoop, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- astructural_and_overlay_watermark.py +++ bstructural_and_overlay_watermark.py @@ -147,7 +147,7 @@ obfuscated_key = NameObject("/XObjD5fA2e1") - for page in reader.pages: + for page in []: # Check for our custom structural watermark watermark_obj = page.get("/PieceInfo") if watermark_obj and obfuscated_key in watermark_obj:</pre></div><div class="alert alert-secondary"><pre class="diff">..........F... [100%] ================================== FAILURES =================================== __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() assert upload_resp.status_code == 201 assert upload_resp_data.get("id") == 2 #Test the route parameters = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password", "id": 2} parameters_no_id = {"method": "overlay-watermark", "position": "metadata-only", "key": "strong-password"} resp = client.post("/api/read-watermark", json=parameters) #resp = client.post("/api/read-watermark/2", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 52 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:400: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1226 Error when attempting to read watermark for document 2: list index out of range ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_read_watermark_route - assert 400 == 201 1 failed, 13 passed, 22 warnings in 19.92s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2410"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2410_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2410_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2410_1"><button class="btn btn-outline-success"><span class="job_id">2410 : Job ID 6dd1c5ee81a1457e85e9f4d84cfe4abc</span></button></div></a><div aria-labelledby="job_list___sub_heading_2410_1" data-parent="#job_list___sub_accordion_2410" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2410_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=274" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (274, 25), end pos: (274, 26)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Sub, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -271,7 +271,7 @@ salt = base64.b64decode(payload["salt"]) # Combine salt, nonce, and ciphertext - encrypted = salt + nonce + ciphertext + encrypted = salt - nonce + ciphertext return base64.b64encode(encrypted).decode("ascii") def _decrypt_payload(self, key: bytes) -&gt; dict[str, Any]:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T223048604903Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T223049476782Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614eac387b5a3c34522f: unsupported operand type(s) for -: 'bytes' and 'bytes' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 11 failed, 3 passed, 22 warnings in 19.82s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2411"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2411_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2411_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2411_1"><button class="btn btn-outline-success"><span class="job_id">2411 : Job ID 8614d081f0c64115996707a671880ce4</span></button></div></a><div aria-labelledby="job_list___sub_heading_2411_1" data-parent="#job_list___sub_accordion_2411" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2411_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=274" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (274, 33), end pos: (274, 34)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Sub, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -271,7 +271,7 @@ salt = base64.b64decode(payload["salt"]) # Combine salt, nonce, and ciphertext - encrypted = salt + nonce + ciphertext + encrypted = salt + nonce - ciphertext return base64.b64encode(encrypted).decode("ascii") def _decrypt_payload(self, key: bytes) -&gt; dict[str, Any]:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T041426999989Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T041428107054Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e8805f6134a7561df: unsupported operand type(s) for -: 'bytes' and 'bytes' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 11 failed, 3 passed, 22 warnings in 21.72s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2412"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2412_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2412_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2412_1"><button class="btn btn-outline-danger"><span class="job_id">2412 : Job ID 30cc6a0469b240449cdcb3317cc83216</span></button></div></a><div aria-labelledby="job_list___sub_heading_2412_1" data-parent="#job_list___sub_accordion_2412" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2412_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=325" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (325, 67), end pos: (325, 68)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Sub, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -322,7 +322,7 @@ """Distribute watermark fragments across PDF objects.""" # Split payload into fragments payload_bytes = encrypted_payload.encode("utf-8") - fragment_size = len(payload_bytes) // self._FRAGMENT_COUNT + 1 + fragment_size = len(payload_bytes) // self._FRAGMENT_COUNT - 1 fragments = [] for i in range(self._FRAGMENT_COUNT):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.08s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2413"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2413_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2413_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2413_1"><button class="btn btn-outline-danger"><span class="job_id">2413 : Job ID 6e9ad69aa913476b94614d4879092bd5</span></button></div></a><div aria-labelledby="job_list___sub_heading_2413_1" data-parent="#job_list___sub_accordion_2413" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2413_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=330" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (330, 28), end pos: (330, 29)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Sub, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -327,7 +327,7 @@ for i in range(self._FRAGMENT_COUNT): start = i * fragment_size - end = min(start + fragment_size, len(payload_bytes)) + end = min(start - fragment_size, len(payload_bytes)) fragment = payload_bytes[start:end] fragments.append(fragment) </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.11s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2414"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2414_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2414_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2414_1"><button class="btn btn-outline-danger"><span class="job_id">2414 : Job ID 388657d8886642f1b32b6541a29c2497</span></button></div></a><div aria-labelledby="job_list___sub_heading_2414_1" data-parent="#job_list___sub_accordion_2414" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2414_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=434" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (434, 54), end pos: (434, 55)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Sub, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -431,7 +431,7 @@ # Try to extract salt from the encrypted payload encrypted_data = base64.b64decode(encrypted_payload) - if len(encrypted_data) &gt;= self._SALT_SIZE + 12: + if len(encrypted_data) &gt;= self._SALT_SIZE - 12: # Extract salt from beginning of encrypted data salt = encrypted_data[: self._SALT_SIZE] nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE + 12]</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.33s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2415"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2415_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2415_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2415_1"><button class="btn btn-outline-danger"><span class="job_id">2415 : Job ID f530c688585e43a49498e767cc24a3aa</span></button></div></a><div aria-labelledby="job_list___sub_heading_2415_1" data-parent="#job_list___sub_accordion_2415" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2415_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=437" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (437, 73), end pos: (437, 74)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Sub, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -434,7 +434,7 @@ if len(encrypted_data) &gt;= self._SALT_SIZE + 12: # Extract salt from beginning of encrypted data salt = encrypted_data[: self._SALT_SIZE] - nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE + 12] + nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE - 12] ciphertext = encrypted_data[self._SALT_SIZE + 12 :] # Derive key using extracted salt</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.56s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2416"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2416_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2416_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2416_1"><button class="btn btn-outline-danger"><span class="job_id">2416 : Job ID d3196af9902041ccbf4a330a449ccc6b</span></button></div></a><div aria-labelledby="job_list___sub_heading_2416_1" data-parent="#job_list___sub_accordion_2416" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2416_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=438" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (438, 60), end pos: (438, 61)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Sub, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -435,7 +435,7 @@ # Extract salt from beginning of encrypted data salt = encrypted_data[: self._SALT_SIZE] nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE + 12] - ciphertext = encrypted_data[self._SALT_SIZE + 12 :] + ciphertext = encrypted_data[self._SALT_SIZE - 12 :] # Derive key using extracted salt derived_key = self._derive_key(key, salt)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.23s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2417"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2417_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2417_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2417_1"><button class="btn btn-outline-success"><span class="job_id">2417 : Job ID bf9afd1a10984e9d931108fd403a17af</span></button></div></a><div aria-labelledby="job_list___sub_heading_2417_1" data-parent="#job_list___sub_accordion_2417" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2417_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=274" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (274, 25), end pos: (274, 26)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Mul, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -271,7 +271,7 @@ salt = base64.b64decode(payload["salt"]) # Combine salt, nonce, and ciphertext - encrypted = salt + nonce + ciphertext + encrypted = salt * nonce + ciphertext return base64.b64encode(encrypted).decode("ascii") def _decrypt_payload(self, key: bytes) -&gt; dict[str, Any]:</pre></div><div class="alert alert-secondary"><pre class="diff">.........F...F [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1034 Watermarking failed for document 1 using method robust-xmp: can't multiply sequence by non-int of type 'bytes' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e7fd52744e3419f16: can't multiply sequence by non-int of type 'bytes' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 2 failed, 12 passed, 22 warnings in 20.48s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2418"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2418_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2418_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2418_1"><button class="btn btn-outline-success"><span class="job_id">2418 : Job ID 90ba0039098a44849889d1254af99053</span></button></div></a><div aria-labelledby="job_list___sub_heading_2418_1" data-parent="#job_list___sub_accordion_2418" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2418_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=274" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (274, 33), end pos: (274, 34)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Mul, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -271,7 +271,7 @@ salt = base64.b64decode(payload["salt"]) # Combine salt, nonce, and ciphertext - encrypted = salt + nonce + ciphertext + encrypted = salt + nonce * ciphertext return base64.b64encode(encrypted).decode("ascii") def _decrypt_payload(self, key: bytes) -&gt; dict[str, Any]:</pre></div><div class="alert alert-secondary"><pre class="diff">.........F...F [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1034 Watermarking failed for document 1 using method robust-xmp: can't multiply sequence by non-int of type 'bytes' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e0fbef19afb8627f8: can't multiply sequence by non-int of type 'bytes' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 2 failed, 12 passed, 22 warnings in 20.51s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2419"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2419_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2419_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2419_1"><button class="btn btn-outline-danger"><span class="job_id">2419 : Job ID 6d0e0dae649b4a13ba342307431ab0bd</span></button></div></a><div aria-labelledby="job_list___sub_heading_2419_1" data-parent="#job_list___sub_accordion_2419" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2419_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=325" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (325, 67), end pos: (325, 68)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Mul, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -322,7 +322,7 @@ """Distribute watermark fragments across PDF objects.""" # Split payload into fragments payload_bytes = encrypted_payload.encode("utf-8") - fragment_size = len(payload_bytes) // self._FRAGMENT_COUNT + 1 + fragment_size = len(payload_bytes) // self._FRAGMENT_COUNT * 1 fragments = [] for i in range(self._FRAGMENT_COUNT):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.47s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2420"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2420_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2420_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2420_1"><button class="btn btn-outline-success"><span class="job_id">2420 : Job ID 6620b4c737e24a468901127b87ee36de</span></button></div></a><div aria-labelledby="job_list___sub_heading_2420_1" data-parent="#job_list___sub_accordion_2420" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2420_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=330" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (330, 28), end pos: (330, 29)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Mul, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -327,7 +327,7 @@ for i in range(self._FRAGMENT_COUNT): start = i * fragment_size - end = min(start + fragment_size, len(payload_bytes)) + end = min(start * fragment_size, len(payload_bytes)) fragment = payload_bytes[start:end] fragments.append(fragment) </pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%]</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2421"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2421_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2421_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2421_1"><button class="btn btn-outline-danger"><span class="job_id">2421 : Job ID 34468f152d1d458ca06fcae76b1f6e36</span></button></div></a><div aria-labelledby="job_list___sub_heading_2421_1" data-parent="#job_list___sub_accordion_2421" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2421_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=434" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (434, 54), end pos: (434, 55)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Mul, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -431,7 +431,7 @@ # Try to extract salt from the encrypted payload encrypted_data = base64.b64decode(encrypted_payload) - if len(encrypted_data) &gt;= self._SALT_SIZE + 12: + if len(encrypted_data) &gt;= self._SALT_SIZE * 12: # Extract salt from beginning of encrypted data salt = encrypted_data[: self._SALT_SIZE] nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE + 12]</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.03s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2422"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2422_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2422_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2422_1"><button class="btn btn-outline-danger"><span class="job_id">2422 : Job ID 03cfd034d16f4656aa08990522db17e3</span></button></div></a><div aria-labelledby="job_list___sub_heading_2422_1" data-parent="#job_list___sub_accordion_2422" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2422_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=437" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (437, 73), end pos: (437, 74)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Mul, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -434,7 +434,7 @@ if len(encrypted_data) &gt;= self._SALT_SIZE + 12: # Extract salt from beginning of encrypted data salt = encrypted_data[: self._SALT_SIZE] - nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE + 12] + nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE * 12] ciphertext = encrypted_data[self._SALT_SIZE + 12 :] # Derive key using extracted salt</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.83s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2423"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2423_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2423_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2423_1"><button class="btn btn-outline-success"><span class="job_id">2423 : Job ID 36eaabbcf90c4976a0abbaddb6d3c735</span></button></div></a><div aria-labelledby="job_list___sub_heading_2423_1" data-parent="#job_list___sub_accordion_2423" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2423_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=438" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (438, 60), end pos: (438, 61)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Mul, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -435,7 +435,7 @@ # Extract salt from beginning of encrypted data salt = encrypted_data[: self._SALT_SIZE] nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE + 12] - ciphertext = encrypted_data[self._SALT_SIZE + 12 :] + ciphertext = encrypted_data[self._SALT_SIZE * 12 :] # Derive key using extracted salt derived_key = self._derive_key(key, salt)</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e4dc8ba2fbb522689: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.57s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2424"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2424_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2424_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2424_1"><button class="btn btn-outline-success"><span class="job_id">2424 : Job ID 44c3d48cb51b4a4facfbbec2a860ab7f</span></button></div></a><div aria-labelledby="job_list___sub_heading_2424_1" data-parent="#job_list___sub_accordion_2424" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2424_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=274" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (274, 25), end pos: (274, 26)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Div, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -271,7 +271,7 @@ salt = base64.b64decode(payload["salt"]) # Combine salt, nonce, and ciphertext - encrypted = salt + nonce + ciphertext + encrypted = salt / nonce + ciphertext return base64.b64encode(encrypted).decode("ascii") def _decrypt_payload(self, key: bytes) -&gt; dict[str, Any]:</pre></div><div class="alert alert-secondary"><pre class="diff">.........F...F [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1034 Watermarking failed for document 1 using method robust-xmp: unsupported operand type(s) for /: 'bytes' and 'bytes' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e9e096094e6dcd9a6: unsupported operand type(s) for /: 'bytes' and 'bytes' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 2 failed, 12 passed, 22 warnings in 20.29s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2425"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2425_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2425_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2425_1"><button class="btn btn-outline-success"><span class="job_id">2425 : Job ID b7f4819c6e9148b3b19c3a022117edd5</span></button></div></a><div aria-labelledby="job_list___sub_heading_2425_1" data-parent="#job_list___sub_accordion_2425" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2425_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=274" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (274, 33), end pos: (274, 34)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Div, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -271,7 +271,7 @@ salt = base64.b64decode(payload["salt"]) # Combine salt, nonce, and ciphertext - encrypted = salt + nonce + ciphertext + encrypted = salt + nonce / ciphertext return base64.b64encode(encrypted).decode("ascii") def _decrypt_payload(self, key: bytes) -&gt; dict[str, Any]:</pre></div><div class="alert alert-secondary"><pre class="diff">.........F...F [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1034 Watermarking failed for document 1 using method robust-xmp: unsupported operand type(s) for /: 'bytes' and 'bytes' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e4bd782c14bb5c0c3: unsupported operand type(s) for /: 'bytes' and 'bytes' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 2 failed, 12 passed, 22 warnings in 20.27s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2426"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2426_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2426_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2426_1"><button class="btn btn-outline-success"><span class="job_id">2426 : Job ID ab72c8edcfe94062b1d877424829eafc</span></button></div></a><div aria-labelledby="job_list___sub_heading_2426_1" data-parent="#job_list___sub_accordion_2426" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2426_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=325" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (325, 67), end pos: (325, 68)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Div, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -322,7 +322,7 @@ """Distribute watermark fragments across PDF objects.""" # Split payload into fragments payload_bytes = encrypted_payload.encode("utf-8") - fragment_size = len(payload_bytes) // self._FRAGMENT_COUNT + 1 + fragment_size = len(payload_bytes) // self._FRAGMENT_COUNT / 1 fragments = [] for i in range(self._FRAGMENT_COUNT):</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%]</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2427"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2427_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2427_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2427_1"><button class="btn btn-outline-success"><span class="job_id">2427 : Job ID 0f535b1c54ec4a84a859d3e5658dab4e</span></button></div></a><div aria-labelledby="job_list___sub_heading_2427_1" data-parent="#job_list___sub_accordion_2427" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2427_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=330" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (330, 28), end pos: (330, 29)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Div, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -327,7 +327,7 @@ for i in range(self._FRAGMENT_COUNT): start = i * fragment_size - end = min(start + fragment_size, len(payload_bytes)) + end = min(start / fragment_size, len(payload_bytes)) fragment = payload_bytes[start:end] fragments.append(fragment) </pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T231951417244Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T231952324648Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e27ba331d4dbb6e4e: slice indices must be integers or None or have an __index__ method ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 9 failed, 5 passed, 22 warnings in 19.27s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2428"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2428_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2428_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2428_1"><button class="btn btn-outline-danger"><span class="job_id">2428 : Job ID 2d57150121a244afb086f1b3523b0b06</span></button></div></a><div aria-labelledby="job_list___sub_heading_2428_1" data-parent="#job_list___sub_accordion_2428" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2428_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=434" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (434, 54), end pos: (434, 55)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Div, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -431,7 +431,7 @@ # Try to extract salt from the encrypted payload encrypted_data = base64.b64decode(encrypted_payload) - if len(encrypted_data) &gt;= self._SALT_SIZE + 12: + if len(encrypted_data) &gt;= self._SALT_SIZE / 12: # Extract salt from beginning of encrypted data salt = encrypted_data[: self._SALT_SIZE] nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE + 12]</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.74s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2429"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2429_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2429_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2429_1"><button class="btn btn-outline-success"><span class="job_id">2429 : Job ID 7f0b31c6732242dd9fc2f2f945316e11</span></button></div></a><div aria-labelledby="job_list___sub_heading_2429_1" data-parent="#job_list___sub_accordion_2429" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2429_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=437" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (437, 73), end pos: (437, 74)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Div, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -434,7 +434,7 @@ if len(encrypted_data) &gt;= self._SALT_SIZE + 12: # Extract salt from beginning of encrypted data salt = encrypted_data[: self._SALT_SIZE] - nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE + 12] + nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE / 12] ciphertext = encrypted_data[self._SALT_SIZE + 12 :] # Derive key using extracted salt</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T053615318685Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T053616255914Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 20.23s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2430"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2430_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2430_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2430_1"><button class="btn btn-outline-success"><span class="job_id">2430 : Job ID fadcfc1a7846474898715b99983261cb</span></button></div></a><div aria-labelledby="job_list___sub_heading_2430_1" data-parent="#job_list___sub_accordion_2430" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2430_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=438" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (438, 60), end pos: (438, 61)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Div, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -435,7 +435,7 @@ # Extract salt from beginning of encrypted data salt = encrypted_data[: self._SALT_SIZE] nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE + 12] - ciphertext = encrypted_data[self._SALT_SIZE + 12 :] + ciphertext = encrypted_data[self._SALT_SIZE / 12 :] # Derive key using extracted salt derived_key = self._derive_key(key, salt)</pre></div><div class="alert alert-secondary"><pre class="diff">...F.......... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:228: in open request = self._request_from_builder_args(args, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:200: in _request_from_builder_args return builder.get_request() ^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:764: in get_request return cls(self.get_environ()) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:688: in get_environ input_stream, content_length, boundary = stream_encode_multipart( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:130: in stream_encode_multipart write_binary(encoder.send_event(Data(data=chunk, more_data=True))) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:81: in write_binary return stream.write(s) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... 1 failed, 13 passed, 22 warnings in 20.79s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2431"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2431_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2431_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2431_1"><button class="btn btn-outline-success"><span class="job_id">2431 : Job ID 8f9ab2caa5c6441c9e10baf607d105a6</span></button></div></a><div aria-labelledby="job_list___sub_heading_2431_1" data-parent="#job_list___sub_accordion_2431" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2431_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=274" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (274, 25), end pos: (274, 26)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_FloorDiv, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -271,7 +271,7 @@ salt = base64.b64decode(payload["salt"]) # Combine salt, nonce, and ciphertext - encrypted = salt + nonce + ciphertext + encrypted = salt // nonce + ciphertext return base64.b64encode(encrypted).decode("ascii") def _decrypt_payload(self, key: bytes) -&gt; dict[str, Any]:</pre></div><div class="alert alert-secondary"><pre class="diff">.........F...F [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1034 Watermarking failed for document 1 using method robust-xmp: unsupported operand type(s) for //: 'bytes' and 'bytes' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e8aaf85105f62c1e0: unsupported operand type(s) for //: 'bytes' and 'bytes' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 2 failed, 12 passed, 22 warnings in 21.21s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2432"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2432_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2432_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2432_1"><button class="btn btn-outline-success"><span class="job_id">2432 : Job ID 192e87a6697e409f8b9d1acd61d8e318</span></button></div></a><div aria-labelledby="job_list___sub_heading_2432_1" data-parent="#job_list___sub_accordion_2432" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2432_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=274" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (274, 33), end pos: (274, 34)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_FloorDiv, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -271,7 +271,7 @@ salt = base64.b64decode(payload["salt"]) # Combine salt, nonce, and ciphertext - encrypted = salt + nonce + ciphertext + encrypted = salt + nonce // ciphertext return base64.b64encode(encrypted).decode("ascii") def _decrypt_payload(self, key: bytes) -&gt; dict[str, Any]:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T195116582996Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T195117550596Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e1d859372ab3b5980: unsupported operand type(s) for //: 'bytes' and 'bytes' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 9 failed, 5 passed, 22 warnings in 19.81s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2433"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2433_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2433_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2433_1"><button class="btn btn-outline-danger"><span class="job_id">2433 : Job ID ee02515647d8420abbec48e1d0ecbfe4</span></button></div></a><div aria-labelledby="job_list___sub_heading_2433_1" data-parent="#job_list___sub_accordion_2433" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2433_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=325" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (325, 67), end pos: (325, 68)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_FloorDiv, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -322,7 +322,7 @@ """Distribute watermark fragments across PDF objects.""" # Split payload into fragments payload_bytes = encrypted_payload.encode("utf-8") - fragment_size = len(payload_bytes) // self._FRAGMENT_COUNT + 1 + fragment_size = len(payload_bytes) // self._FRAGMENT_COUNT // 1 fragments = [] for i in range(self._FRAGMENT_COUNT):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.46s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2434"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2434_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2434_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2434_1"><button class="btn btn-outline-danger"><span class="job_id">2434 : Job ID 7fb3db6a70d347c08e649dc0821a2734</span></button></div></a><div aria-labelledby="job_list___sub_heading_2434_1" data-parent="#job_list___sub_accordion_2434" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2434_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=330" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (330, 28), end pos: (330, 29)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_FloorDiv, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -327,7 +327,7 @@ for i in range(self._FRAGMENT_COUNT): start = i * fragment_size - end = min(start + fragment_size, len(payload_bytes)) + end = min(start // fragment_size, len(payload_bytes)) fragment = payload_bytes[start:end] fragments.append(fragment) </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.10s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2435"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2435_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2435_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2435_1"><button class="btn btn-outline-danger"><span class="job_id">2435 : Job ID 081fb0ee381a4e1aacd8013480c27b4a</span></button></div></a><div aria-labelledby="job_list___sub_heading_2435_1" data-parent="#job_list___sub_accordion_2435" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2435_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=434" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (434, 54), end pos: (434, 55)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_FloorDiv, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -431,7 +431,7 @@ # Try to extract salt from the encrypted payload encrypted_data = base64.b64decode(encrypted_payload) - if len(encrypted_data) &gt;= self._SALT_SIZE + 12: + if len(encrypted_data) &gt;= self._SALT_SIZE // 12: # Extract salt from beginning of encrypted data salt = encrypted_data[: self._SALT_SIZE] nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE + 12]</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.65s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2436"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2436_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2436_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2436_1"><button class="btn btn-outline-success"><span class="job_id">2436 : Job ID fb53b70f24c54eed82cab1e46ee2114b</span></button></div></a><div aria-labelledby="job_list___sub_heading_2436_1" data-parent="#job_list___sub_accordion_2436" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2436_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=437" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (437, 73), end pos: (437, 74)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_FloorDiv, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -434,7 +434,7 @@ if len(encrypted_data) &gt;= self._SALT_SIZE + 12: # Extract salt from beginning of encrypted data salt = encrypted_data[: self._SALT_SIZE] - nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE + 12] + nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE // 12] ciphertext = encrypted_data[self._SALT_SIZE + 12 :] # Derive key using extracted salt</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T161122501411Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T161123420482Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.33s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2437"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2437_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2437_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2437_1"><button class="btn btn-outline-success"><span class="job_id">2437 : Job ID 7a7de43d34ef43d993f2cb8a5517b2a1</span></button></div></a><div aria-labelledby="job_list___sub_heading_2437_1" data-parent="#job_list___sub_accordion_2437" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2437_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=438" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (438, 60), end pos: (438, 61)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_FloorDiv, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -435,7 +435,7 @@ # Extract salt from beginning of encrypted data salt = encrypted_data[: self._SALT_SIZE] nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE + 12] - ciphertext = encrypted_data[self._SALT_SIZE + 12 :] + ciphertext = encrypted_data[self._SALT_SIZE // 12 :] # Derive key using extracted salt derived_key = self._derive_key(key, salt)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T184740043224Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T184740930619Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.72s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2438"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2438_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2438_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2438_1"><button class="btn btn-outline-success"><span class="job_id">2438 : Job ID 2c1a0690831643eb8476c0a0c0f57bd9</span></button></div></a><div aria-labelledby="job_list___sub_heading_2438_1" data-parent="#job_list___sub_accordion_2438" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2438_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=274" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (274, 25), end pos: (274, 26)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Mod, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -271,7 +271,7 @@ salt = base64.b64decode(payload["salt"]) # Combine salt, nonce, and ciphertext - encrypted = salt + nonce + ciphertext + encrypted = salt % nonce + ciphertext return base64.b64encode(encrypted).decode("ascii") def _decrypt_payload(self, key: bytes) -&gt; dict[str, Any]:</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1034 Watermarking failed for document 1 using method robust-xmp: not all arguments converted during bytes formatting __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614edac11e98771627a3: not all arguments converted during bytes formatting ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 22.28s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2439"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2439_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2439_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2439_1"><button class="btn btn-outline-success"><span class="job_id">2439 : Job ID 8ab0c19cdd5f41059767ac58d70c2a5c</span></button></div></a><div aria-labelledby="job_list___sub_heading_2439_1" data-parent="#job_list___sub_accordion_2439" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2439_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=274" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (274, 33), end pos: (274, 34)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Mod, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -271,7 +271,7 @@ salt = base64.b64decode(payload["salt"]) # Combine salt, nonce, and ciphertext - encrypted = salt + nonce + ciphertext + encrypted = salt + nonce % ciphertext return base64.b64encode(encrypted).decode("ascii") def _decrypt_payload(self, key: bytes) -&gt; dict[str, Any]:</pre></div><div class="alert alert-secondary"><pre class="diff">.........F...F [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1034 Watermarking failed for document 1 using method robust-xmp: not all arguments converted during bytes formatting _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e97d51592ecbaefc7: not all arguments converted during bytes formatting ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 2 failed, 12 passed, 22 warnings in 20.82s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2440"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2440_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2440_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2440_1"><button class="btn btn-outline-danger"><span class="job_id">2440 : Job ID 4bc17054fd5d43dab42a60c218eee826</span></button></div></a><div aria-labelledby="job_list___sub_heading_2440_1" data-parent="#job_list___sub_accordion_2440" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2440_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=325" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (325, 67), end pos: (325, 68)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Mod, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -322,7 +322,7 @@ """Distribute watermark fragments across PDF objects.""" # Split payload into fragments payload_bytes = encrypted_payload.encode("utf-8") - fragment_size = len(payload_bytes) // self._FRAGMENT_COUNT + 1 + fragment_size = len(payload_bytes) // self._FRAGMENT_COUNT % 1 fragments = [] for i in range(self._FRAGMENT_COUNT):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.63s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2441"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2441_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2441_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2441_1"><button class="btn btn-outline-success"><span class="job_id">2441 : Job ID 200c572e4b694b52b47c88e3c099408b</span></button></div></a><div aria-labelledby="job_list___sub_heading_2441_1" data-parent="#job_list___sub_accordion_2441" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2441_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=330" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (330, 28), end pos: (330, 29)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Mod, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -327,7 +327,7 @@ for i in range(self._FRAGMENT_COUNT): start = i * fragment_size - end = min(start + fragment_size, len(payload_bytes)) + end = min(start % fragment_size, len(payload_bytes)) fragment = payload_bytes[start:end] fragments.append(fragment) </pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T145402660130Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T145403620228Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.47s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2442"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2442_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2442_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2442_1"><button class="btn btn-outline-danger"><span class="job_id">2442 : Job ID 2887775f4fe441be83819733ab13832b</span></button></div></a><div aria-labelledby="job_list___sub_heading_2442_1" data-parent="#job_list___sub_accordion_2442" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2442_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=434" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (434, 54), end pos: (434, 55)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Mod, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -431,7 +431,7 @@ # Try to extract salt from the encrypted payload encrypted_data = base64.b64decode(encrypted_payload) - if len(encrypted_data) &gt;= self._SALT_SIZE + 12: + if len(encrypted_data) &gt;= self._SALT_SIZE % 12: # Extract salt from beginning of encrypted data salt = encrypted_data[: self._SALT_SIZE] nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE + 12]</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.17s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2443"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2443_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2443_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2443_1"><button class="btn btn-outline-danger"><span class="job_id">2443 : Job ID 77ff7c67c5094321ad423aff6a1b06c7</span></button></div></a><div aria-labelledby="job_list___sub_heading_2443_1" data-parent="#job_list___sub_accordion_2443" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2443_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=437" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (437, 73), end pos: (437, 74)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Mod, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -434,7 +434,7 @@ if len(encrypted_data) &gt;= self._SALT_SIZE + 12: # Extract salt from beginning of encrypted data salt = encrypted_data[: self._SALT_SIZE] - nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE + 12] + nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE % 12] ciphertext = encrypted_data[self._SALT_SIZE + 12 :] # Derive key using extracted salt</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.42s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2444"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2444_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2444_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2444_1"><button class="btn btn-outline-success"><span class="job_id">2444 : Job ID 23d899cfdb934780bd2908b7d2e38b80</span></button></div></a><div aria-labelledby="job_list___sub_heading_2444_1" data-parent="#job_list___sub_accordion_2444" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2444_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=438" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (438, 60), end pos: (438, 61)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Mod, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -435,7 +435,7 @@ # Extract salt from beginning of encrypted data salt = encrypted_data[: self._SALT_SIZE] nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE + 12] - ciphertext = encrypted_data[self._SALT_SIZE + 12 :] + ciphertext = encrypted_data[self._SALT_SIZE % 12 :] # Derive key using extracted salt derived_key = self._derive_key(key, salt)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T143616275871Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T143617226005Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 20.12s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2445"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2445_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2445_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2445_1"><button class="btn btn-outline-success"><span class="job_id">2445 : Job ID d09ab353143748cfbdfbfc3ce0008b57</span></button></div></a><div aria-labelledby="job_list___sub_heading_2445_1" data-parent="#job_list___sub_accordion_2445" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2445_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=274" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (274, 25), end pos: (274, 26)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Pow, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -271,7 +271,7 @@ salt = base64.b64decode(payload["salt"]) # Combine salt, nonce, and ciphertext - encrypted = salt + nonce + ciphertext + encrypted = salt ** nonce + ciphertext return base64.b64encode(encrypted).decode("ascii") def _decrypt_payload(self, key: bytes) -&gt; dict[str, Any]:</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1034 Watermarking failed for document 1 using method robust-xmp: unsupported operand type(s) for ** or pow(): 'bytes' and 'bytes' __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e0559021003cb826a: unsupported operand type(s) for ** or pow(): 'bytes' and 'bytes' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 21.43s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2446"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2446_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2446_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2446_1"><button class="btn btn-outline-success"><span class="job_id">2446 : Job ID f45282df050249938867959e1d915307</span></button></div></a><div aria-labelledby="job_list___sub_heading_2446_1" data-parent="#job_list___sub_accordion_2446" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2446_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=274" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (274, 33), end pos: (274, 34)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Pow, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -271,7 +271,7 @@ salt = base64.b64decode(payload["salt"]) # Combine salt, nonce, and ciphertext - encrypted = salt + nonce + ciphertext + encrypted = salt + nonce ** ciphertext return base64.b64encode(encrypted).decode("ascii") def _decrypt_payload(self, key: bytes) -&gt; dict[str, Any]:</pre></div><div class="alert alert-secondary"><pre class="diff">.........F...F [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1034 Watermarking failed for document 1 using method robust-xmp: unsupported operand type(s) for ** or pow(): 'bytes' and 'bytes' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ed2865a25c9b7e3a0: unsupported operand type(s) for ** or pow(): 'bytes' and 'bytes' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 2 failed, 12 passed, 22 warnings in 20.41s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2447"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2447_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2447_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2447_1"><button class="btn btn-outline-danger"><span class="job_id">2447 : Job ID f2f526604e7749ff8e8699107b17ae82</span></button></div></a><div aria-labelledby="job_list___sub_heading_2447_1" data-parent="#job_list___sub_accordion_2447" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2447_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=325" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (325, 67), end pos: (325, 68)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Pow, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -322,7 +322,7 @@ """Distribute watermark fragments across PDF objects.""" # Split payload into fragments payload_bytes = encrypted_payload.encode("utf-8") - fragment_size = len(payload_bytes) // self._FRAGMENT_COUNT + 1 + fragment_size = len(payload_bytes) // self._FRAGMENT_COUNT ** 1 fragments = [] for i in range(self._FRAGMENT_COUNT):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.75s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2448"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2448_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2448_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2448_1"><button class="btn btn-outline-success"><span class="job_id">2448 : Job ID ab8c8feccb06469483d01bed99bafb7c</span></button></div></a><div aria-labelledby="job_list___sub_heading_2448_1" data-parent="#job_list___sub_accordion_2448" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2448_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=330" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (330, 28), end pos: (330, 29)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Pow, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -327,7 +327,7 @@ for i in range(self._FRAGMENT_COUNT): start = i * fragment_size - end = min(start + fragment_size, len(payload_bytes)) + end = min(start ** fragment_size, len(payload_bytes)) fragment = payload_bytes[start:end] fragments.append(fragment) </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T033624016076Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T033624935082Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.50s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2449"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2449_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2449_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2449_1"><button class="btn btn-outline-danger"><span class="job_id">2449 : Job ID 0b4126d7ebe34e77a5b3c55900593ade</span></button></div></a><div aria-labelledby="job_list___sub_heading_2449_1" data-parent="#job_list___sub_accordion_2449" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2449_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=434" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (434, 54), end pos: (434, 55)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Pow, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -431,7 +431,7 @@ # Try to extract salt from the encrypted payload encrypted_data = base64.b64decode(encrypted_payload) - if len(encrypted_data) &gt;= self._SALT_SIZE + 12: + if len(encrypted_data) &gt;= self._SALT_SIZE ** 12: # Extract salt from beginning of encrypted data salt = encrypted_data[: self._SALT_SIZE] nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE + 12]</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.47s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2450"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2450_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2450_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2450_1"><button class="btn btn-outline-danger"><span class="job_id">2450 : Job ID 3bd210899d9e43459bdc123b31e42464</span></button></div></a><div aria-labelledby="job_list___sub_heading_2450_1" data-parent="#job_list___sub_accordion_2450" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2450_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=437" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (437, 73), end pos: (437, 74)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Pow, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -434,7 +434,7 @@ if len(encrypted_data) &gt;= self._SALT_SIZE + 12: # Extract salt from beginning of encrypted data salt = encrypted_data[: self._SALT_SIZE] - nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE + 12] + nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE ** 12] ciphertext = encrypted_data[self._SALT_SIZE + 12 :] # Derive key using extracted salt</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.43s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2451"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2451_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2451_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2451_1"><button class="btn btn-outline-danger"><span class="job_id">2451 : Job ID 4ab1595de074413da52c6f79275b5422</span></button></div></a><div aria-labelledby="job_list___sub_heading_2451_1" data-parent="#job_list___sub_accordion_2451" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2451_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=438" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (438, 60), end pos: (438, 61)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_Pow, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -435,7 +435,7 @@ # Extract salt from beginning of encrypted data salt = encrypted_data[: self._SALT_SIZE] nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE + 12] - ciphertext = encrypted_data[self._SALT_SIZE + 12 :] + ciphertext = encrypted_data[self._SALT_SIZE ** 12 :] # Derive key using extracted salt derived_key = self._derive_key(key, salt)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.00s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2452"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2452_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2452_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2452_1"><button class="btn btn-outline-success"><span class="job_id">2452 : Job ID 2d5da50e13864b16a9451f7be57e168a</span></button></div></a><div aria-labelledby="job_list___sub_heading_2452_1" data-parent="#job_list___sub_accordion_2452" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2452_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=274" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (274, 25), end pos: (274, 26)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_RShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -271,7 +271,7 @@ salt = base64.b64decode(payload["salt"]) # Combine salt, nonce, and ciphertext - encrypted = salt + nonce + ciphertext + encrypted = salt &gt;&gt; nonce + ciphertext return base64.b64encode(encrypted).decode("ascii") def _decrypt_payload(self, key: bytes) -&gt; dict[str, Any]:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T144808790238Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T144809651889Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e0fceabc392757d97: unsupported operand type(s) for &gt;&gt;: 'bytes' and 'bytes' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 11 failed, 3 passed, 22 warnings in 19.40s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2453"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2453_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2453_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2453_1"><button class="btn btn-outline-success"><span class="job_id">2453 : Job ID 5bbc786c79a24be8b4ffbc83a58e816a</span></button></div></a><div aria-labelledby="job_list___sub_heading_2453_1" data-parent="#job_list___sub_accordion_2453" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2453_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=274" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (274, 33), end pos: (274, 34)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_RShift, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -271,7 +271,7 @@ salt = base64.b64decode(payload["salt"]) # Combine salt, nonce, and ciphertext - encrypted = salt + nonce + ciphertext + encrypted = salt + nonce &gt;&gt; ciphertext return base64.b64encode(encrypted).decode("ascii") def _decrypt_payload(self, key: bytes) -&gt; dict[str, Any]:</pre></div><div class="alert alert-secondary"><pre class="diff">.........F...F [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1034 Watermarking failed for document 1 using method robust-xmp: unsupported operand type(s) for &gt;&gt;: 'bytes' and 'bytes' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e7d86f984101c651c: unsupported operand type(s) for &gt;&gt;: 'bytes' and 'bytes' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 2 failed, 12 passed, 22 warnings in 20.03s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2454"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2454_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2454_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2454_1"><button class="btn btn-outline-danger"><span class="job_id">2454 : Job ID bafb1e81e93a46529dbb85a4484a3d98</span></button></div></a><div aria-labelledby="job_list___sub_heading_2454_1" data-parent="#job_list___sub_accordion_2454" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2454_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=325" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (325, 67), end pos: (325, 68)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_RShift, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -322,7 +322,7 @@ """Distribute watermark fragments across PDF objects.""" # Split payload into fragments payload_bytes = encrypted_payload.encode("utf-8") - fragment_size = len(payload_bytes) // self._FRAGMENT_COUNT + 1 + fragment_size = len(payload_bytes) // self._FRAGMENT_COUNT &gt;&gt; 1 fragments = [] for i in range(self._FRAGMENT_COUNT):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.36s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2455"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2455_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2455_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2455_1"><button class="btn btn-outline-danger"><span class="job_id">2455 : Job ID 97d24e51151448b09fccd3875cfb799c</span></button></div></a><div aria-labelledby="job_list___sub_heading_2455_1" data-parent="#job_list___sub_accordion_2455" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2455_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=330" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (330, 28), end pos: (330, 29)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_RShift, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -327,7 +327,7 @@ for i in range(self._FRAGMENT_COUNT): start = i * fragment_size - end = min(start + fragment_size, len(payload_bytes)) + end = min(start &gt;&gt; fragment_size, len(payload_bytes)) fragment = payload_bytes[start:end] fragments.append(fragment) </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.93s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2456"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2456_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2456_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2456_1"><button class="btn btn-outline-danger"><span class="job_id">2456 : Job ID e276d73e06e1400c8ac9d1c9f960c399</span></button></div></a><div aria-labelledby="job_list___sub_heading_2456_1" data-parent="#job_list___sub_accordion_2456" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2456_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=434" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (434, 54), end pos: (434, 55)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_RShift, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -431,7 +431,7 @@ # Try to extract salt from the encrypted payload encrypted_data = base64.b64decode(encrypted_payload) - if len(encrypted_data) &gt;= self._SALT_SIZE + 12: + if len(encrypted_data) &gt;= self._SALT_SIZE &gt;&gt; 12: # Extract salt from beginning of encrypted data salt = encrypted_data[: self._SALT_SIZE] nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE + 12]</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.03s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2457"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2457_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2457_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2457_1"><button class="btn btn-outline-danger"><span class="job_id">2457 : Job ID a39e6ba3a9a84e048f16a676b82f69bf</span></button></div></a><div aria-labelledby="job_list___sub_heading_2457_1" data-parent="#job_list___sub_accordion_2457" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2457_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=437" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (437, 73), end pos: (437, 74)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_RShift, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -434,7 +434,7 @@ if len(encrypted_data) &gt;= self._SALT_SIZE + 12: # Extract salt from beginning of encrypted data salt = encrypted_data[: self._SALT_SIZE] - nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE + 12] + nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE &gt;&gt; 12] ciphertext = encrypted_data[self._SALT_SIZE + 12 :] # Derive key using extracted salt</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.10s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2458"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2458_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2458_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2458_1"><button class="btn btn-outline-danger"><span class="job_id">2458 : Job ID a24db3edf12f4838af887aeaffe976be</span></button></div></a><div aria-labelledby="job_list___sub_heading_2458_1" data-parent="#job_list___sub_accordion_2458" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2458_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=438" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (438, 60), end pos: (438, 61)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_RShift, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -435,7 +435,7 @@ # Extract salt from beginning of encrypted data salt = encrypted_data[: self._SALT_SIZE] nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE + 12] - ciphertext = encrypted_data[self._SALT_SIZE + 12 :] + ciphertext = encrypted_data[self._SALT_SIZE &gt;&gt; 12 :] # Derive key using extracted salt derived_key = self._derive_key(key, salt)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.31s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2459"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2459_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2459_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2459_1"><button class="btn btn-outline-success"><span class="job_id">2459 : Job ID ac753360a4b9451694f16ef14e66fd66</span></button></div></a><div aria-labelledby="job_list___sub_heading_2459_1" data-parent="#job_list___sub_accordion_2459" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2459_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=274" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (274, 25), end pos: (274, 26)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_LShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -271,7 +271,7 @@ salt = base64.b64decode(payload["salt"]) # Combine salt, nonce, and ciphertext - encrypted = salt + nonce + ciphertext + encrypted = salt &lt;&lt; nonce + ciphertext return base64.b64encode(encrypted).decode("ascii") def _decrypt_payload(self, key: bytes) -&gt; dict[str, Any]:</pre></div><div class="alert alert-secondary"><pre class="diff">.........F...F [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1034 Watermarking failed for document 1 using method robust-xmp: unsupported operand type(s) for &lt;&lt;: 'bytes' and 'bytes' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e737ca40f570f913b: unsupported operand type(s) for &lt;&lt;: 'bytes' and 'bytes' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 2 failed, 12 passed, 22 warnings in 20.10s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2460"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2460_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2460_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2460_1"><button class="btn btn-outline-success"><span class="job_id">2460 : Job ID 54dfab0cbe6047c895c096444f36a917</span></button></div></a><div aria-labelledby="job_list___sub_heading_2460_1" data-parent="#job_list___sub_accordion_2460" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2460_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=274" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (274, 33), end pos: (274, 34)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_LShift, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -271,7 +271,7 @@ salt = base64.b64decode(payload["salt"]) # Combine salt, nonce, and ciphertext - encrypted = salt + nonce + ciphertext + encrypted = salt + nonce &lt;&lt; ciphertext return base64.b64encode(encrypted).decode("ascii") def _decrypt_payload(self, key: bytes) -&gt; dict[str, Any]:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T224142893573Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T224143827916Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e631d3f23fe02c35a: unsupported operand type(s) for &lt;&lt;: 'bytes' and 'bytes' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 9 failed, 5 passed, 22 warnings in 19.73s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2461"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2461_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2461_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2461_1"><button class="btn btn-outline-success"><span class="job_id">2461 : Job ID b7cc47bddfc74cfdbde1fd59cf6e38f1</span></button></div></a><div aria-labelledby="job_list___sub_heading_2461_1" data-parent="#job_list___sub_accordion_2461" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2461_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=325" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (325, 67), end pos: (325, 68)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_LShift, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -322,7 +322,7 @@ """Distribute watermark fragments across PDF objects.""" # Split payload into fragments payload_bytes = encrypted_payload.encode("utf-8") - fragment_size = len(payload_bytes) // self._FRAGMENT_COUNT + 1 + fragment_size = len(payload_bytes) // self._FRAGMENT_COUNT &lt;&lt; 1 fragments = [] for i in range(self._FRAGMENT_COUNT):</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T142619014381Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T142619959892Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 20.23s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2462"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2462_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2462_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2462_1"><button class="btn btn-outline-danger"><span class="job_id">2462 : Job ID 06219be96298453f90497912d256c75e</span></button></div></a><div aria-labelledby="job_list___sub_heading_2462_1" data-parent="#job_list___sub_accordion_2462" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2462_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=330" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (330, 28), end pos: (330, 29)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_LShift, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -327,7 +327,7 @@ for i in range(self._FRAGMENT_COUNT): start = i * fragment_size - end = min(start + fragment_size, len(payload_bytes)) + end = min(start &lt;&lt; fragment_size, len(payload_bytes)) fragment = payload_bytes[start:end] fragments.append(fragment) </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.13s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2463"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2463_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2463_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2463_1"><button class="btn btn-outline-danger"><span class="job_id">2463 : Job ID d693cb1bc3bf4b788df17cea71f995a3</span></button></div></a><div aria-labelledby="job_list___sub_heading_2463_1" data-parent="#job_list___sub_accordion_2463" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2463_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=434" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (434, 54), end pos: (434, 55)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_LShift, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -431,7 +431,7 @@ # Try to extract salt from the encrypted payload encrypted_data = base64.b64decode(encrypted_payload) - if len(encrypted_data) &gt;= self._SALT_SIZE + 12: + if len(encrypted_data) &gt;= self._SALT_SIZE &lt;&lt; 12: # Extract salt from beginning of encrypted data salt = encrypted_data[: self._SALT_SIZE] nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE + 12]</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.23s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2464"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2464_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2464_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2464_1"><button class="btn btn-outline-danger"><span class="job_id">2464 : Job ID 9fd98f01aa2a4927898aa8a08bb915ad</span></button></div></a><div aria-labelledby="job_list___sub_heading_2464_1" data-parent="#job_list___sub_accordion_2464" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2464_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=437" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (437, 73), end pos: (437, 74)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_LShift, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -434,7 +434,7 @@ if len(encrypted_data) &gt;= self._SALT_SIZE + 12: # Extract salt from beginning of encrypted data salt = encrypted_data[: self._SALT_SIZE] - nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE + 12] + nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE &lt;&lt; 12] ciphertext = encrypted_data[self._SALT_SIZE + 12 :] # Derive key using extracted salt</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.45s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2465"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2465_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2465_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2465_1"><button class="btn btn-outline-danger"><span class="job_id">2465 : Job ID d11ebcae54f44119b62671e95323e1b0</span></button></div></a><div aria-labelledby="job_list___sub_heading_2465_1" data-parent="#job_list___sub_accordion_2465" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2465_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=438" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (438, 60), end pos: (438, 61)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_LShift, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -435,7 +435,7 @@ # Extract salt from beginning of encrypted data salt = encrypted_data[: self._SALT_SIZE] nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE + 12] - ciphertext = encrypted_data[self._SALT_SIZE + 12 :] + ciphertext = encrypted_data[self._SALT_SIZE &lt;&lt; 12 :] # Derive key using extracted salt derived_key = self._derive_key(key, salt)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.84s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2466"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2466_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2466_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2466_1"><button class="btn btn-outline-success"><span class="job_id">2466 : Job ID aae856c035f74978b0e3953bbd666bde</span></button></div></a><div aria-labelledby="job_list___sub_heading_2466_1" data-parent="#job_list___sub_accordion_2466" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2466_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=274" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (274, 25), end pos: (274, 26)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitOr, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -271,7 +271,7 @@ salt = base64.b64decode(payload["salt"]) # Combine salt, nonce, and ciphertext - encrypted = salt + nonce + ciphertext + encrypted = salt | nonce + ciphertext return base64.b64encode(encrypted).decode("ascii") def _decrypt_payload(self, key: bytes) -&gt; dict[str, Any]:</pre></div><div class="alert alert-secondary"><pre class="diff">.........F...F [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1034 Watermarking failed for document 1 using method robust-xmp: unsupported operand type(s) for |: 'bytes' and 'bytes' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e1d85f68db13879f0: unsupported operand type(s) for |: 'bytes' and 'bytes' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 2 failed, 12 passed, 22 warnings in 20.06s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2467"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2467_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2467_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2467_1"><button class="btn btn-outline-success"><span class="job_id">2467 : Job ID dc5354acd4ef45d49d7503b8cab66ba7</span></button></div></a><div aria-labelledby="job_list___sub_heading_2467_1" data-parent="#job_list___sub_accordion_2467" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2467_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=274" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (274, 33), end pos: (274, 34)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitOr, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -271,7 +271,7 @@ salt = base64.b64decode(payload["salt"]) # Combine salt, nonce, and ciphertext - encrypted = salt + nonce + ciphertext + encrypted = salt + nonce | ciphertext return base64.b64encode(encrypted).decode("ascii") def _decrypt_payload(self, key: bytes) -&gt; dict[str, Any]:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T150309907351Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T150310812868Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e1cd3029cf3880900: unsupported operand type(s) for |: 'bytes' and 'bytes' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 10 failed, 4 passed, 22 warnings in 19.29s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2468"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2468_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2468_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2468_1"><button class="btn btn-outline-success"><span class="job_id">2468 : Job ID e454e494122b43de889be8d966cf1ae5</span></button></div></a><div aria-labelledby="job_list___sub_heading_2468_1" data-parent="#job_list___sub_accordion_2468" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2468_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=325" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (325, 67), end pos: (325, 68)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitOr, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -322,7 +322,7 @@ """Distribute watermark fragments across PDF objects.""" # Split payload into fragments payload_bytes = encrypted_payload.encode("utf-8") - fragment_size = len(payload_bytes) // self._FRAGMENT_COUNT + 1 + fragment_size = len(payload_bytes) // self._FRAGMENT_COUNT | 1 fragments = [] for i in range(self._FRAGMENT_COUNT):</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T161326634077Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T161327530118Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.40s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2469"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2469_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2469_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2469_1"><button class="btn btn-outline-danger"><span class="job_id">2469 : Job ID 67ad6f72700147e29e1a55720c1cd0ee</span></button></div></a><div aria-labelledby="job_list___sub_heading_2469_1" data-parent="#job_list___sub_accordion_2469" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2469_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=330" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (330, 28), end pos: (330, 29)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitOr, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -327,7 +327,7 @@ for i in range(self._FRAGMENT_COUNT): start = i * fragment_size - end = min(start + fragment_size, len(payload_bytes)) + end = min(start | fragment_size, len(payload_bytes)) fragment = payload_bytes[start:end] fragments.append(fragment) </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.00s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2470"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2470_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2470_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2470_1"><button class="btn btn-outline-success"><span class="job_id">2470 : Job ID fc1dbd81a1914bc38252159f83580bab</span></button></div></a><div aria-labelledby="job_list___sub_heading_2470_1" data-parent="#job_list___sub_accordion_2470" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2470_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=434" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (434, 54), end pos: (434, 55)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitOr, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -431,7 +431,7 @@ # Try to extract salt from the encrypted payload encrypted_data = base64.b64decode(encrypted_payload) - if len(encrypted_data) &gt;= self._SALT_SIZE + 12: + if len(encrypted_data) &gt;= self._SALT_SIZE | 12: # Extract salt from beginning of encrypted data salt = encrypted_data[: self._SALT_SIZE] nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE + 12]</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T195711550434Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T195712586322Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ERROR server:rmap_handler.py:245 Failed to add source PDF to database: No users exist to own RMAP base document; create a user first ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 11 failed, 3 passed, 22 warnings in 20.12s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2471"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2471_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2471_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2471_1"><button class="btn btn-outline-danger"><span class="job_id">2471 : Job ID 41ec2ebb57384bdf9616bed88bb77e09</span></button></div></a><div aria-labelledby="job_list___sub_heading_2471_1" data-parent="#job_list___sub_accordion_2471" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2471_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=437" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (437, 73), end pos: (437, 74)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitOr, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -434,7 +434,7 @@ if len(encrypted_data) &gt;= self._SALT_SIZE + 12: # Extract salt from beginning of encrypted data salt = encrypted_data[: self._SALT_SIZE] - nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE + 12] + nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE | 12] ciphertext = encrypted_data[self._SALT_SIZE + 12 :] # Derive key using extracted salt</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.23s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2472"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2472_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2472_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2472_1"><button class="btn btn-outline-success"><span class="job_id">2472 : Job ID 1078c18468d6465189a1a0cd7af2b42c</span></button></div></a><div aria-labelledby="job_list___sub_heading_2472_1" data-parent="#job_list___sub_accordion_2472" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2472_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=438" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (438, 60), end pos: (438, 61)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitOr, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -435,7 +435,7 @@ # Extract salt from beginning of encrypted data salt = encrypted_data[: self._SALT_SIZE] nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE + 12] - ciphertext = encrypted_data[self._SALT_SIZE + 12 :] + ciphertext = encrypted_data[self._SALT_SIZE | 12 :] # Derive key using extracted salt derived_key = self._derive_key(key, salt)</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e9147dbafe6e08dc8: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 21.05s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2473"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2473_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2473_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2473_1"><button class="btn btn-outline-success"><span class="job_id">2473 : Job ID a66d568464534f4cb7eb8baefc8d2d27</span></button></div></a><div aria-labelledby="job_list___sub_heading_2473_1" data-parent="#job_list___sub_accordion_2473" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2473_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=274" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (274, 25), end pos: (274, 26)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitAnd, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -271,7 +271,7 @@ salt = base64.b64decode(payload["salt"]) # Combine salt, nonce, and ciphertext - encrypted = salt + nonce + ciphertext + encrypted = salt &amp; nonce + ciphertext return base64.b64encode(encrypted).decode("ascii") def _decrypt_payload(self, key: bytes) -&gt; dict[str, Any]:</pre></div><div class="alert alert-secondary"><pre class="diff">.........F...F [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1034 Watermarking failed for document 1 using method robust-xmp: unsupported operand type(s) for &amp;: 'bytes' and 'bytes' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e20138fae48b28d69: unsupported operand type(s) for &amp;: 'bytes' and 'bytes' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 2 failed, 12 passed, 22 warnings in 20.10s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2474"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2474_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2474_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2474_1"><button class="btn btn-outline-success"><span class="job_id">2474 : Job ID 06f37ff824a943db91fa189bc216f5ba</span></button></div></a><div aria-labelledby="job_list___sub_heading_2474_1" data-parent="#job_list___sub_accordion_2474" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2474_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=274" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (274, 33), end pos: (274, 34)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitAnd, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -271,7 +271,7 @@ salt = base64.b64decode(payload["salt"]) # Combine salt, nonce, and ciphertext - encrypted = salt + nonce + ciphertext + encrypted = salt + nonce &amp; ciphertext return base64.b64encode(encrypted).decode("ascii") def _decrypt_payload(self, key: bytes) -&gt; dict[str, Any]:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T021630905464Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T021631883424Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ed7c69aac3c101712: unsupported operand type(s) for &amp;: 'bytes' and 'bytes' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 9 failed, 5 passed, 22 warnings in 19.34s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2475"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2475_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2475_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2475_1"><button class="btn btn-outline-success"><span class="job_id">2475 : Job ID f0084e7c961044289385959c243fb022</span></button></div></a><div aria-labelledby="job_list___sub_heading_2475_1" data-parent="#job_list___sub_accordion_2475" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2475_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=325" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (325, 67), end pos: (325, 68)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitAnd, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -322,7 +322,7 @@ """Distribute watermark fragments across PDF objects.""" # Split payload into fragments payload_bytes = encrypted_payload.encode("utf-8") - fragment_size = len(payload_bytes) // self._FRAGMENT_COUNT + 1 + fragment_size = len(payload_bytes) // self._FRAGMENT_COUNT &amp; 1 fragments = [] for i in range(self._FRAGMENT_COUNT):</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T233656057867Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T233657022080Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.42s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2476"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2476_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2476_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2476_1"><button class="btn btn-outline-success"><span class="job_id">2476 : Job ID 48d8b6bd577d4cfdacbe8639b9d607b9</span></button></div></a><div aria-labelledby="job_list___sub_heading_2476_1" data-parent="#job_list___sub_accordion_2476" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2476_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=330" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (330, 28), end pos: (330, 29)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitAnd, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -327,7 +327,7 @@ for i in range(self._FRAGMENT_COUNT): start = i * fragment_size - end = min(start + fragment_size, len(payload_bytes)) + end = min(start &amp; fragment_size, len(payload_bytes)) fragment = payload_bytes[start:end] fragments.append(fragment) </pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e1c0ba4e5e4424399: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.64s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2477"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2477_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2477_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2477_1"><button class="btn btn-outline-danger"><span class="job_id">2477 : Job ID 9fbde152fff84ca4aaef8610d1960249</span></button></div></a><div aria-labelledby="job_list___sub_heading_2477_1" data-parent="#job_list___sub_accordion_2477" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2477_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=434" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (434, 54), end pos: (434, 55)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitAnd, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -431,7 +431,7 @@ # Try to extract salt from the encrypted payload encrypted_data = base64.b64decode(encrypted_payload) - if len(encrypted_data) &gt;= self._SALT_SIZE + 12: + if len(encrypted_data) &gt;= self._SALT_SIZE &amp; 12: # Extract salt from beginning of encrypted data salt = encrypted_data[: self._SALT_SIZE] nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE + 12]</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.20s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2478"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2478_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2478_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2478_1"><button class="btn btn-outline-danger"><span class="job_id">2478 : Job ID c58936b0d30d43ec80b349ae3295d1d1</span></button></div></a><div aria-labelledby="job_list___sub_heading_2478_1" data-parent="#job_list___sub_accordion_2478" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2478_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=437" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (437, 73), end pos: (437, 74)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitAnd, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -434,7 +434,7 @@ if len(encrypted_data) &gt;= self._SALT_SIZE + 12: # Extract salt from beginning of encrypted data salt = encrypted_data[: self._SALT_SIZE] - nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE + 12] + nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE &amp; 12] ciphertext = encrypted_data[self._SALT_SIZE + 12 :] # Derive key using extracted salt</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.13s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2479"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2479_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2479_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2479_1"><button class="btn btn-outline-danger"><span class="job_id">2479 : Job ID 658dedd628544ef58ec826a5a151c3d0</span></button></div></a><div aria-labelledby="job_list___sub_heading_2479_1" data-parent="#job_list___sub_accordion_2479" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2479_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=438" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (438, 60), end pos: (438, 61)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitAnd, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -435,7 +435,7 @@ # Extract salt from beginning of encrypted data salt = encrypted_data[: self._SALT_SIZE] nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE + 12] - ciphertext = encrypted_data[self._SALT_SIZE + 12 :] + ciphertext = encrypted_data[self._SALT_SIZE &amp; 12 :] # Derive key using extracted salt derived_key = self._derive_key(key, salt)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.06s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2480"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2480_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2480_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2480_1"><button class="btn btn-outline-success"><span class="job_id">2480 : Job ID dfc6c26b68c84870ad62e7604945861b</span></button></div></a><div aria-labelledby="job_list___sub_heading_2480_1" data-parent="#job_list___sub_accordion_2480" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2480_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=274" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (274, 25), end pos: (274, 26)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitXor, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -271,7 +271,7 @@ salt = base64.b64decode(payload["salt"]) # Combine salt, nonce, and ciphertext - encrypted = salt + nonce + ciphertext + encrypted = salt ^ nonce + ciphertext return base64.b64encode(encrypted).decode("ascii") def _decrypt_payload(self, key: bytes) -&gt; dict[str, Any]:</pre></div><div class="alert alert-secondary"><pre class="diff">.........F...F [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1034 Watermarking failed for document 1 using method robust-xmp: unsupported operand type(s) for ^: 'bytes' and 'bytes' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e9a62a7f6ca303f9b: unsupported operand type(s) for ^: 'bytes' and 'bytes' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 2 failed, 12 passed, 22 warnings in 20.11s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2481"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2481_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2481_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2481_1"><button class="btn btn-outline-success"><span class="job_id">2481 : Job ID f12407341e9248d796b8b4ee601f2a71</span></button></div></a><div aria-labelledby="job_list___sub_heading_2481_1" data-parent="#job_list___sub_accordion_2481" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2481_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=274" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (274, 33), end pos: (274, 34)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitXor, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -271,7 +271,7 @@ salt = base64.b64decode(payload["salt"]) # Combine salt, nonce, and ciphertext - encrypted = salt + nonce + ciphertext + encrypted = salt + nonce ^ ciphertext return base64.b64encode(encrypted).decode("ascii") def _decrypt_payload(self, key: bytes) -&gt; dict[str, Any]:</pre></div><div class="alert alert-secondary"><pre class="diff">.........F...F [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1034 Watermarking failed for document 1 using method robust-xmp: unsupported operand type(s) for ^: 'bytes' and 'bytes' _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614eabcbc53c998835f3: unsupported operand type(s) for ^: 'bytes' and 'bytes' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 2 failed, 12 passed, 22 warnings in 20.42s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2482"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2482_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2482_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2482_1"><button class="btn btn-outline-danger"><span class="job_id">2482 : Job ID 414a9fa2544b40d6a9ba9a44fde39ffd</span></button></div></a><div aria-labelledby="job_list___sub_heading_2482_1" data-parent="#job_list___sub_accordion_2482" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2482_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=325" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (325, 67), end pos: (325, 68)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitXor, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -322,7 +322,7 @@ """Distribute watermark fragments across PDF objects.""" # Split payload into fragments payload_bytes = encrypted_payload.encode("utf-8") - fragment_size = len(payload_bytes) // self._FRAGMENT_COUNT + 1 + fragment_size = len(payload_bytes) // self._FRAGMENT_COUNT ^ 1 fragments = [] for i in range(self._FRAGMENT_COUNT):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.27s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2483"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2483_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2483_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2483_1"><button class="btn btn-outline-success"><span class="job_id">2483 : Job ID 1ca6fc6cdc9b481cbc439fe63cea7f1e</span></button></div></a><div aria-labelledby="job_list___sub_heading_2483_1" data-parent="#job_list___sub_accordion_2483" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2483_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=330" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (330, 28), end pos: (330, 29)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitXor, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -327,7 +327,7 @@ for i in range(self._FRAGMENT_COUNT): start = i * fragment_size - end = min(start + fragment_size, len(payload_bytes)) + end = min(start ^ fragment_size, len(payload_bytes)) fragment = payload_bytes[start:end] fragments.append(fragment) </pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T051934499996Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T051935689928Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 21.33s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2484"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2484_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2484_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2484_1"><button class="btn btn-outline-danger"><span class="job_id">2484 : Job ID a85e97a095954c7aba4a9e522afe4e29</span></button></div></a><div aria-labelledby="job_list___sub_heading_2484_1" data-parent="#job_list___sub_accordion_2484" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2484_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=434" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (434, 54), end pos: (434, 55)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitXor, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -431,7 +431,7 @@ # Try to extract salt from the encrypted payload encrypted_data = base64.b64decode(encrypted_payload) - if len(encrypted_data) &gt;= self._SALT_SIZE + 12: + if len(encrypted_data) &gt;= self._SALT_SIZE ^ 12: # Extract salt from beginning of encrypted data salt = encrypted_data[: self._SALT_SIZE] nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE + 12]</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.89s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2485"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2485_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2485_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2485_1"><button class="btn btn-outline-success"><span class="job_id">2485 : Job ID 4518f4ad398b40d6bbc7c2cfc96ca581</span></button></div></a><div aria-labelledby="job_list___sub_heading_2485_1" data-parent="#job_list___sub_accordion_2485" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2485_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=437" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (437, 73), end pos: (437, 74)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitXor, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -434,7 +434,7 @@ if len(encrypted_data) &gt;= self._SALT_SIZE + 12: # Extract salt from beginning of encrypted data salt = encrypted_data[: self._SALT_SIZE] - nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE + 12] + nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE ^ 12] ciphertext = encrypted_data[self._SALT_SIZE + 12 :] # Derive key using extracted salt</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T190033818352Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T190034787173Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 20.49s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2486"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2486_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2486_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2486_1"><button class="btn btn-outline-danger"><span class="job_id">2486 : Job ID 88a2bd0eb5e2409994480df1e64897f3</span></button></div></a><div aria-labelledby="job_list___sub_heading_2486_1" data-parent="#job_list___sub_accordion_2486" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2486_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=438" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (438, 60), end pos: (438, 61)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Add_BitXor, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -435,7 +435,7 @@ # Extract salt from beginning of encrypted data salt = encrypted_data[: self._SALT_SIZE] nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE + 12] - ciphertext = encrypted_data[self._SALT_SIZE + 12 :] + ciphertext = encrypted_data[self._SALT_SIZE ^ 12 :] # Derive key using extracted salt derived_key = self._derive_key(key, salt)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 22.66s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2487"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2487_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2487_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2487_1"><button class="btn btn-outline-danger"><span class="job_id">2487 : Job ID c5ec87128ac74b209d51c845acd2de59</span></button></div></a><div aria-labelledby="job_list___sub_heading_2487_1" data-parent="#job_list___sub_accordion_2487" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2487_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=329" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (329, 22), end pos: (329, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Mul_Add, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -326,7 +326,7 @@ fragments = [] for i in range(self._FRAGMENT_COUNT): - start = i * fragment_size + start = i + fragment_size end = min(start + fragment_size, len(payload_bytes)) fragment = payload_bytes[start:end] fragments.append(fragment)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.32s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2488"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2488_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2488_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2488_1"><button class="btn btn-outline-success"><span class="job_id">2488 : Job ID c00592f383e14aaaaa98c18c9ce04765</span></button></div></a><div aria-labelledby="job_list___sub_heading_2488_1" data-parent="#job_list___sub_accordion_2488" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2488_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=329" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (329, 22), end pos: (329, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Mul_Sub, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -326,7 +326,7 @@ fragments = [] for i in range(self._FRAGMENT_COUNT): - start = i * fragment_size + start = i - fragment_size end = min(start + fragment_size, len(payload_bytes)) fragment = payload_bytes[start:end] fragments.append(fragment)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T025435444547Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T025436301565Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.43s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2489"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2489_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2489_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2489_1"><button class="btn btn-outline-success"><span class="job_id">2489 : Job ID 1a590513fd354effbe3559fdc6608d90</span></button></div></a><div aria-labelledby="job_list___sub_heading_2489_1" data-parent="#job_list___sub_accordion_2489" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2489_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=329" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (329, 22), end pos: (329, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Mul_Div, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -326,7 +326,7 @@ fragments = [] for i in range(self._FRAGMENT_COUNT): - start = i * fragment_size + start = i / fragment_size end = min(start + fragment_size, len(payload_bytes)) fragment = payload_bytes[start:end] fragments.append(fragment)</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e103c8e8798d50cae: slice indices must be integers or None or have an __index__ method ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 20.81s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2490"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2490_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2490_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2490_1"><button class="btn btn-outline-danger"><span class="job_id">2490 : Job ID cade1e43b409463497c194db2e00e1d9</span></button></div></a><div aria-labelledby="job_list___sub_heading_2490_1" data-parent="#job_list___sub_accordion_2490" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2490_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=329" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (329, 22), end pos: (329, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Mul_FloorDiv, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -326,7 +326,7 @@ fragments = [] for i in range(self._FRAGMENT_COUNT): - start = i * fragment_size + start = i // fragment_size end = min(start + fragment_size, len(payload_bytes)) fragment = payload_bytes[start:end] fragments.append(fragment)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.02s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2491"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2491_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2491_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2491_1"><button class="btn btn-outline-success"><span class="job_id">2491 : Job ID ebcee1903b1b4a25b21a368e87df29ac</span></button></div></a><div aria-labelledby="job_list___sub_heading_2491_1" data-parent="#job_list___sub_accordion_2491" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2491_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=329" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (329, 22), end pos: (329, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Mul_Mod, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -326,7 +326,7 @@ fragments = [] for i in range(self._FRAGMENT_COUNT): - start = i * fragment_size + start = i % fragment_size end = min(start + fragment_size, len(payload_bytes)) fragment = payload_bytes[start:end] fragments.append(fragment)</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%]</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2492"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2492_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2492_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2492_1"><button class="btn btn-outline-success"><span class="job_id">2492 : Job ID 76c2ab35f9034a7781ffdb782973232b</span></button></div></a><div aria-labelledby="job_list___sub_heading_2492_1" data-parent="#job_list___sub_accordion_2492" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2492_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=329" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (329, 22), end pos: (329, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Mul_Pow, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -326,7 +326,7 @@ fragments = [] for i in range(self._FRAGMENT_COUNT): - start = i * fragment_size + start = i ** fragment_size end = min(start + fragment_size, len(payload_bytes)) fragment = payload_bytes[start:end] fragments.append(fragment)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T193530092938Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T193531063812Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.74s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2493"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2493_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2493_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2493_1"><button class="btn btn-outline-danger"><span class="job_id">2493 : Job ID 5453b04aea9f4eb3958b7ebc2a2095ec</span></button></div></a><div aria-labelledby="job_list___sub_heading_2493_1" data-parent="#job_list___sub_accordion_2493" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2493_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=329" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (329, 22), end pos: (329, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Mul_RShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -326,7 +326,7 @@ fragments = [] for i in range(self._FRAGMENT_COUNT): - start = i * fragment_size + start = i &gt;&gt; fragment_size end = min(start + fragment_size, len(payload_bytes)) fragment = payload_bytes[start:end] fragments.append(fragment)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.94s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2494"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2494_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2494_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2494_1"><button class="btn btn-outline-danger"><span class="job_id">2494 : Job ID 7ea29f587c764892879acd680c81ef7b</span></button></div></a><div aria-labelledby="job_list___sub_heading_2494_1" data-parent="#job_list___sub_accordion_2494" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2494_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=329" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (329, 22), end pos: (329, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Mul_LShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -326,7 +326,7 @@ fragments = [] for i in range(self._FRAGMENT_COUNT): - start = i * fragment_size + start = i &lt;&lt; fragment_size end = min(start + fragment_size, len(payload_bytes)) fragment = payload_bytes[start:end] fragments.append(fragment)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.27s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2495"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2495_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2495_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2495_1"><button class="btn btn-outline-danger"><span class="job_id">2495 : Job ID 00bffd65846d405380b2687180987ee7</span></button></div></a><div aria-labelledby="job_list___sub_heading_2495_1" data-parent="#job_list___sub_accordion_2495" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2495_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=329" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (329, 22), end pos: (329, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Mul_BitOr, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -326,7 +326,7 @@ fragments = [] for i in range(self._FRAGMENT_COUNT): - start = i * fragment_size + start = i | fragment_size end = min(start + fragment_size, len(payload_bytes)) fragment = payload_bytes[start:end] fragments.append(fragment)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.33s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2496"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2496_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2496_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2496_1"><button class="btn btn-outline-danger"><span class="job_id">2496 : Job ID 5dd63e011d4e44a8a65a8f2f13f70e37</span></button></div></a><div aria-labelledby="job_list___sub_heading_2496_1" data-parent="#job_list___sub_accordion_2496" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2496_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=329" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (329, 22), end pos: (329, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Mul_BitAnd, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -326,7 +326,7 @@ fragments = [] for i in range(self._FRAGMENT_COUNT): - start = i * fragment_size + start = i &amp; fragment_size end = min(start + fragment_size, len(payload_bytes)) fragment = payload_bytes[start:end] fragments.append(fragment)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.22s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2497"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2497_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2497_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2497_1"><button class="btn btn-outline-danger"><span class="job_id">2497 : Job ID 1680a601aa4541d7b8ab4f3f4cbdc17e</span></button></div></a><div aria-labelledby="job_list___sub_heading_2497_1" data-parent="#job_list___sub_accordion_2497" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2497_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=329" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (329, 22), end pos: (329, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_Mul_BitXor, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -326,7 +326,7 @@ fragments = [] for i in range(self._FRAGMENT_COUNT): - start = i * fragment_size + start = i ^ fragment_size end = min(start + fragment_size, len(payload_bytes)) fragment = payload_bytes[start:end] fragments.append(fragment)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.23s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2498"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2498_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2498_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2498_1"><button class="btn btn-outline-success"><span class="job_id">2498 : Job ID 09578c382e434e1e9f6bcb8a82eec7b8</span></button></div></a><div aria-labelledby="job_list___sub_heading_2498_1" data-parent="#job_list___sub_accordion_2498" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2498_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=325" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (325, 43), end pos: (325, 45)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_FloorDiv_Add, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -322,7 +322,7 @@ """Distribute watermark fragments across PDF objects.""" # Split payload into fragments payload_bytes = encrypted_payload.encode("utf-8") - fragment_size = len(payload_bytes) // self._FRAGMENT_COUNT + 1 + fragment_size = len(payload_bytes) + self._FRAGMENT_COUNT + 1 fragments = [] for i in range(self._FRAGMENT_COUNT):</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T043850965984Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T043852312731Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 21.51s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2499"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2499_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2499_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2499_1"><button class="btn btn-outline-success"><span class="job_id">2499 : Job ID 5e926b9ae02348c8b5f3e2997568738a</span></button></div></a><div aria-labelledby="job_list___sub_heading_2499_1" data-parent="#job_list___sub_accordion_2499" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2499_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=325" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (325, 43), end pos: (325, 45)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_FloorDiv_Sub, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -322,7 +322,7 @@ """Distribute watermark fragments across PDF objects.""" # Split payload into fragments payload_bytes = encrypted_payload.encode("utf-8") - fragment_size = len(payload_bytes) // self._FRAGMENT_COUNT + 1 + fragment_size = len(payload_bytes) - self._FRAGMENT_COUNT + 1 fragments = [] for i in range(self._FRAGMENT_COUNT):</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ee1a58cffdb67ca8e: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.92s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2500"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2500_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2500_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2500_1"><button class="btn btn-outline-danger"><span class="job_id">2500 : Job ID 7b1ef9fc31204f5ba29f77f406e24067</span></button></div></a><div aria-labelledby="job_list___sub_heading_2500_1" data-parent="#job_list___sub_accordion_2500" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2500_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=325" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (325, 43), end pos: (325, 45)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_FloorDiv_Mul, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -322,7 +322,7 @@ """Distribute watermark fragments across PDF objects.""" # Split payload into fragments payload_bytes = encrypted_payload.encode("utf-8") - fragment_size = len(payload_bytes) // self._FRAGMENT_COUNT + 1 + fragment_size = len(payload_bytes) * self._FRAGMENT_COUNT + 1 fragments = [] for i in range(self._FRAGMENT_COUNT):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.99s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2501"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2501_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2501_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2501_1"><button class="btn btn-outline-success"><span class="job_id">2501 : Job ID c622cb95e013424a8691ec0c8b7dd385</span></button></div></a><div aria-labelledby="job_list___sub_heading_2501_1" data-parent="#job_list___sub_accordion_2501" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2501_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=325" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (325, 43), end pos: (325, 45)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_FloorDiv_Div, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -322,7 +322,7 @@ """Distribute watermark fragments across PDF objects.""" # Split payload into fragments payload_bytes = encrypted_payload.encode("utf-8") - fragment_size = len(payload_bytes) // self._FRAGMENT_COUNT + 1 + fragment_size = len(payload_bytes) / self._FRAGMENT_COUNT + 1 fragments = [] for i in range(self._FRAGMENT_COUNT):</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T172842105352Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T172842947741Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e1164fbddef871431: slice indices must be integers or None or have an __index__ method ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 11 failed, 3 passed, 22 warnings in 19.11s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2502"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2502_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2502_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2502_1"><button class="btn btn-outline-danger"><span class="job_id">2502 : Job ID 043b1185f2a84a6aa754f577c58f9592</span></button></div></a><div aria-labelledby="job_list___sub_heading_2502_1" data-parent="#job_list___sub_accordion_2502" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2502_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=325" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (325, 43), end pos: (325, 45)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_FloorDiv_Mod, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -322,7 +322,7 @@ """Distribute watermark fragments across PDF objects.""" # Split payload into fragments payload_bytes = encrypted_payload.encode("utf-8") - fragment_size = len(payload_bytes) // self._FRAGMENT_COUNT + 1 + fragment_size = len(payload_bytes) % self._FRAGMENT_COUNT + 1 fragments = [] for i in range(self._FRAGMENT_COUNT):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.40s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2503"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2503_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2503_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2503_1"><button class="btn btn-outline-danger"><span class="job_id">2503 : Job ID ac4de95038b84590a98ea4b2e90e99ea</span></button></div></a><div aria-labelledby="job_list___sub_heading_2503_1" data-parent="#job_list___sub_accordion_2503" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2503_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=325" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (325, 43), end pos: (325, 45)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_FloorDiv_Pow, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -322,7 +322,7 @@ """Distribute watermark fragments across PDF objects.""" # Split payload into fragments payload_bytes = encrypted_payload.encode("utf-8") - fragment_size = len(payload_bytes) // self._FRAGMENT_COUNT + 1 + fragment_size = len(payload_bytes) ** self._FRAGMENT_COUNT + 1 fragments = [] for i in range(self._FRAGMENT_COUNT):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.67s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2504"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2504_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2504_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2504_1"><button class="btn btn-outline-danger"><span class="job_id">2504 : Job ID 071bb24c799d41779b526b0def3848be</span></button></div></a><div aria-labelledby="job_list___sub_heading_2504_1" data-parent="#job_list___sub_accordion_2504" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2504_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=325" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (325, 43), end pos: (325, 45)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_FloorDiv_RShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -322,7 +322,7 @@ """Distribute watermark fragments across PDF objects.""" # Split payload into fragments payload_bytes = encrypted_payload.encode("utf-8") - fragment_size = len(payload_bytes) // self._FRAGMENT_COUNT + 1 + fragment_size = len(payload_bytes) &gt;&gt; self._FRAGMENT_COUNT + 1 fragments = [] for i in range(self._FRAGMENT_COUNT):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.48s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2505"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2505_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2505_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2505_1"><button class="btn btn-outline-danger"><span class="job_id">2505 : Job ID 0b3d05da82ed42dd91ddb3a320b0d487</span></button></div></a><div aria-labelledby="job_list___sub_heading_2505_1" data-parent="#job_list___sub_accordion_2505" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2505_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=325" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (325, 43), end pos: (325, 45)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_FloorDiv_LShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -322,7 +322,7 @@ """Distribute watermark fragments across PDF objects.""" # Split payload into fragments payload_bytes = encrypted_payload.encode("utf-8") - fragment_size = len(payload_bytes) // self._FRAGMENT_COUNT + 1 + fragment_size = len(payload_bytes) &lt;&lt; self._FRAGMENT_COUNT + 1 fragments = [] for i in range(self._FRAGMENT_COUNT):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.95s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2506"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2506_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2506_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2506_1"><button class="btn btn-outline-success"><span class="job_id">2506 : Job ID 28be4e38875e49fb8d0801f433278be1</span></button></div></a><div aria-labelledby="job_list___sub_heading_2506_1" data-parent="#job_list___sub_accordion_2506" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2506_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=325" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (325, 43), end pos: (325, 45)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_FloorDiv_BitOr, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -322,7 +322,7 @@ """Distribute watermark fragments across PDF objects.""" # Split payload into fragments payload_bytes = encrypted_payload.encode("utf-8") - fragment_size = len(payload_bytes) // self._FRAGMENT_COUNT + 1 + fragment_size = len(payload_bytes) | self._FRAGMENT_COUNT + 1 fragments = [] for i in range(self._FRAGMENT_COUNT):</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T182127770815Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T182128732254Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 20.15s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2507"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2507_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2507_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2507_1"><button class="btn btn-outline-danger"><span class="job_id">2507 : Job ID 0294f788f7c8481b85eb33ddf229ab8f</span></button></div></a><div aria-labelledby="job_list___sub_heading_2507_1" data-parent="#job_list___sub_accordion_2507" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2507_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=325" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (325, 43), end pos: (325, 45)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_FloorDiv_BitAnd, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -322,7 +322,7 @@ """Distribute watermark fragments across PDF objects.""" # Split payload into fragments payload_bytes = encrypted_payload.encode("utf-8") - fragment_size = len(payload_bytes) // self._FRAGMENT_COUNT + 1 + fragment_size = len(payload_bytes) &amp; self._FRAGMENT_COUNT + 1 fragments = [] for i in range(self._FRAGMENT_COUNT):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.06s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2508"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2508_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2508_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2508_1"><button class="btn btn-outline-success"><span class="job_id">2508 : Job ID cbf47c0fca2e4ad68a24d2c4670be664</span></button></div></a><div aria-labelledby="job_list___sub_heading_2508_1" data-parent="#job_list___sub_accordion_2508" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2508_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=325" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (325, 43), end pos: (325, 45)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_FloorDiv_BitXor, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -322,7 +322,7 @@ """Distribute watermark fragments across PDF objects.""" # Split payload into fragments payload_bytes = encrypted_payload.encode("utf-8") - fragment_size = len(payload_bytes) // self._FRAGMENT_COUNT + 1 + fragment_size = len(payload_bytes) ^ self._FRAGMENT_COUNT + 1 fragments = [] for i in range(self._FRAGMENT_COUNT):</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T182826916664Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T182827938289Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.79s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2509"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2509_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2509_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2509_1"><button class="btn btn-outline-danger"><span class="job_id">2509 : Job ID ce3e5609a12940b98b514af90cb057ea</span></button></div></a><div aria-labelledby="job_list___sub_heading_2509_1" data-parent="#job_list___sub_accordion_2509" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2509_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=100" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (100, 26), end pos: (100, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -97,7 +97,7 @@ pdf: PdfSource, secret: str, key: str, - intended_for: str | None = None, + intended_for: str + None = None, position: str | None = None, ) -&gt; bytes: """Add a robust watermark to the PDF.</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.86s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2510"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2510_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2510_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2510_1"><button class="btn btn-outline-danger"><span class="job_id">2510 : Job ID d5f3a692b1024ce0a67ea00edb8d638e</span></button></div></a><div aria-labelledby="job_list___sub_heading_2510_1" data-parent="#job_list___sub_accordion_2510" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2510_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=101" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (101, 22), end pos: (101, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -98,7 +98,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str + None = None, ) -&gt; bytes: """Add a robust watermark to the PDF. </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.60s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2511"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2511_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2511_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2511_1"><button class="btn btn-outline-danger"><span class="job_id">2511 : Job ID 25c4e7ba54e5458e93f6100e08a658e5</span></button></div></a><div aria-labelledby="job_list___sub_heading_2511_1" data-parent="#job_list___sub_accordion_2511" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2511_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=194" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (194, 22), end pos: (194, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -191,7 +191,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str + None = None, ) -&gt; bool: """Check if watermarking is applicable.""" if not HAS_PYMUPDF:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.36s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2512"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2512_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2512_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2512_1"><button class="btn btn-outline-success"><span class="job_id">2512 : Job ID 15df0d46fbb34654bb4925de0f15b6ae</span></button></div></a><div aria-labelledby="job_list___sub_heading_2512_1" data-parent="#job_list___sub_accordion_2512" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2512_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=350" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (350, 59), end pos: (350, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -347,7 +347,7 @@ # If we can't add annotations, skip fragments continue - def _extract_from_xmp(self, doc: fitz.Document) -&gt; str | None: + def _extract_from_xmp(self, doc: fitz.Document) -&gt; str + None: """Extract watermark from XMP metadata (document info implementation).""" try: metadata = doc.metadata</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T194959152388Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T195000103798Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.67s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2513"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2513_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2513_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2513_1"><button class="btn btn-outline-danger"><span class="job_id">2513 : Job ID f6ee214c799640f195af1c72718f8b25</span></button></div></a><div aria-labelledby="job_list___sub_heading_2513_1" data-parent="#job_list___sub_accordion_2513" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2513_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=375" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (375, 69), end pos: (375, 70)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -372,7 +372,7 @@ pass return None - def _extract_from_document_info(self, doc: fitz.Document) -&gt; str | None: + def _extract_from_document_info(self, doc: fitz.Document) -&gt; str + None: """Extract watermark from document info dictionary.""" try: metadata = doc.metadata</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.00s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2514"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2514_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2514_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2514_1"><button class="btn btn-outline-danger"><span class="job_id">2514 : Job ID 4596078a4a68426eb0e75f0364c883ed</span></button></div></a><div aria-labelledby="job_list___sub_heading_2514_1" data-parent="#job_list___sub_accordion_2514" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2514_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=390" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (390, 69), end pos: (390, 70)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Add, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -387,7 +387,7 @@ pass return None - def _reconstruct_from_fragments(self, doc: fitz.Document) -&gt; str | None: + def _reconstruct_from_fragments(self, doc: fitz.Document) -&gt; str + None: """Reconstruct watermark from distributed fragments.""" try: fragments = {}</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.42s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2515"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2515_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2515_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2515_1"><button class="btn btn-outline-success"><span class="job_id">2515 : Job ID bd1e6aa497504e9bbcd7c6813a3a935d</span></button></div></a><div aria-labelledby="job_list___sub_heading_2515_1" data-parent="#job_list___sub_accordion_2515" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2515_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=100" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (100, 26), end pos: (100, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -97,7 +97,7 @@ pdf: PdfSource, secret: str, key: str, - intended_for: str | None = None, + intended_for: str - None = None, position: str | None = None, ) -&gt; bytes: """Add a robust watermark to the PDF.</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T021951094712Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T021951963445Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.31s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2516"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2516_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2516_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2516_1"><button class="btn btn-outline-success"><span class="job_id">2516 : Job ID f61679c836334439af9ffa26c93cbdbb</span></button></div></a><div aria-labelledby="job_list___sub_heading_2516_1" data-parent="#job_list___sub_accordion_2516" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2516_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=101" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (101, 22), end pos: (101, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -98,7 +98,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str - None = None, ) -&gt; bytes: """Add a robust watermark to the PDF. </pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e33b8dd220de31be0: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.73s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2517"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2517_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2517_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2517_1"><button class="btn btn-outline-success"><span class="job_id">2517 : Job ID a37ac02a56d04e518f8f851e098040ca</span></button></div></a><div aria-labelledby="job_list___sub_heading_2517_1" data-parent="#job_list___sub_accordion_2517" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2517_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=194" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (194, 22), end pos: (194, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -191,7 +191,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str - None = None, ) -&gt; bool: """Check if watermarking is applicable.""" if not HAS_PYMUPDF:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T152413233632Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T152414218536Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.38s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2518"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2518_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2518_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2518_1"><button class="btn btn-outline-success"><span class="job_id">2518 : Job ID 5f4120386ef042f0941e17fd473471c3</span></button></div></a><div aria-labelledby="job_list___sub_heading_2518_1" data-parent="#job_list___sub_accordion_2518" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2518_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=350" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (350, 59), end pos: (350, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -347,7 +347,7 @@ # If we can't add annotations, skip fragments continue - def _extract_from_xmp(self, doc: fitz.Document) -&gt; str | None: + def _extract_from_xmp(self, doc: fitz.Document) -&gt; str - None: """Extract watermark from XMP metadata (document info implementation).""" try: metadata = doc.metadata</pre></div><div class="alert alert-secondary"><pre class="diff">...F.......... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:228: in open request = self._request_from_builder_args(args, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:200: in _request_from_builder_args return builder.get_request() ^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:764: in get_request return cls(self.get_environ()) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:688: in get_environ input_stream, content_length, boundary = stream_encode_multipart( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:130: in stream_encode_multipart write_binary(encoder.send_event(Data(data=chunk, more_data=True))) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:81: in write_binary return stream.write(s) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... 1 failed, 13 passed, 22 warnings in 21.66s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2519"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2519_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2519_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2519_1"><button class="btn btn-outline-success"><span class="job_id">2519 : Job ID 17cae51829ec4b2093f1dc4d5592ec85</span></button></div></a><div aria-labelledby="job_list___sub_heading_2519_1" data-parent="#job_list___sub_accordion_2519" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2519_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=375" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (375, 69), end pos: (375, 70)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -372,7 +372,7 @@ pass return None - def _extract_from_document_info(self, doc: fitz.Document) -&gt; str | None: + def _extract_from_document_info(self, doc: fitz.Document) -&gt; str - None: """Extract watermark from document info dictionary.""" try: metadata = doc.metadata</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T225751910472Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T225752782835Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.84s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2520"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2520_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2520_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2520_1"><button class="btn btn-outline-danger"><span class="job_id">2520 : Job ID 9a4bd4732136459cbf3bfc70f965f408</span></button></div></a><div aria-labelledby="job_list___sub_heading_2520_1" data-parent="#job_list___sub_accordion_2520" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2520_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=390" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (390, 69), end pos: (390, 70)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Sub, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -387,7 +387,7 @@ pass return None - def _reconstruct_from_fragments(self, doc: fitz.Document) -&gt; str | None: + def _reconstruct_from_fragments(self, doc: fitz.Document) -&gt; str - None: """Reconstruct watermark from distributed fragments.""" try: fragments = {}</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.26s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2521"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2521_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2521_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2521_1"><button class="btn btn-outline-success"><span class="job_id">2521 : Job ID 685a71b40df94432a6571c1468bdc23e</span></button></div></a><div aria-labelledby="job_list___sub_heading_2521_1" data-parent="#job_list___sub_accordion_2521" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2521_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=100" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (100, 26), end pos: (100, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -97,7 +97,7 @@ pdf: PdfSource, secret: str, key: str, - intended_for: str | None = None, + intended_for: str * None = None, position: str | None = None, ) -&gt; bytes: """Add a robust watermark to the PDF.</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T045356838813Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T045357752369Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.77s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2522"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2522_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2522_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2522_1"><button class="btn btn-outline-danger"><span class="job_id">2522 : Job ID 12bdef3a97574a3286170c87b3d79419</span></button></div></a><div aria-labelledby="job_list___sub_heading_2522_1" data-parent="#job_list___sub_accordion_2522" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2522_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=101" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (101, 22), end pos: (101, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -98,7 +98,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str * None = None, ) -&gt; bytes: """Add a robust watermark to the PDF. </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.75s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2523"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2523_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2523_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2523_1"><button class="btn btn-outline-danger"><span class="job_id">2523 : Job ID a0e610647b8a47deaae109bbd4484272</span></button></div></a><div aria-labelledby="job_list___sub_heading_2523_1" data-parent="#job_list___sub_accordion_2523" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2523_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=194" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (194, 22), end pos: (194, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -191,7 +191,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str * None = None, ) -&gt; bool: """Check if watermarking is applicable.""" if not HAS_PYMUPDF:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.11s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2524"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2524_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2524_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2524_1"><button class="btn btn-outline-danger"><span class="job_id">2524 : Job ID da54be9c5a7b483ea701ac8c52cdda5e</span></button></div></a><div aria-labelledby="job_list___sub_heading_2524_1" data-parent="#job_list___sub_accordion_2524" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2524_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=350" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (350, 59), end pos: (350, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -347,7 +347,7 @@ # If we can't add annotations, skip fragments continue - def _extract_from_xmp(self, doc: fitz.Document) -&gt; str | None: + def _extract_from_xmp(self, doc: fitz.Document) -&gt; str * None: """Extract watermark from XMP metadata (document info implementation).""" try: metadata = doc.metadata</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.18s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2525"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2525_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2525_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2525_1"><button class="btn btn-outline-danger"><span class="job_id">2525 : Job ID 2357bd6250a64583b185b829d5c44cde</span></button></div></a><div aria-labelledby="job_list___sub_heading_2525_1" data-parent="#job_list___sub_accordion_2525" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2525_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=375" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (375, 69), end pos: (375, 70)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -372,7 +372,7 @@ pass return None - def _extract_from_document_info(self, doc: fitz.Document) -&gt; str | None: + def _extract_from_document_info(self, doc: fitz.Document) -&gt; str * None: """Extract watermark from document info dictionary.""" try: metadata = doc.metadata</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.39s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2526"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2526_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2526_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2526_1"><button class="btn btn-outline-success"><span class="job_id">2526 : Job ID 85c025265887466184af36cf374ed07e</span></button></div></a><div aria-labelledby="job_list___sub_heading_2526_1" data-parent="#job_list___sub_accordion_2526" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2526_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=390" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (390, 69), end pos: (390, 70)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mul, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -387,7 +387,7 @@ pass return None - def _reconstruct_from_fragments(self, doc: fitz.Document) -&gt; str | None: + def _reconstruct_from_fragments(self, doc: fitz.Document) -&gt; str * None: """Reconstruct watermark from distributed fragments.""" try: fragments = {}</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e35f4101da74eb2b2: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.87s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2527"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2527_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2527_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2527_1"><button class="btn btn-outline-danger"><span class="job_id">2527 : Job ID 647c3b7df43548f6a5923a4fcf30e21f</span></button></div></a><div aria-labelledby="job_list___sub_heading_2527_1" data-parent="#job_list___sub_accordion_2527" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2527_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=100" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (100, 26), end pos: (100, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -97,7 +97,7 @@ pdf: PdfSource, secret: str, key: str, - intended_for: str | None = None, + intended_for: str / None = None, position: str | None = None, ) -&gt; bytes: """Add a robust watermark to the PDF.</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.07s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2528"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2528_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2528_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2528_1"><button class="btn btn-outline-danger"><span class="job_id">2528 : Job ID 15a5274af0f5407290a1b797a65bd309</span></button></div></a><div aria-labelledby="job_list___sub_heading_2528_1" data-parent="#job_list___sub_accordion_2528" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2528_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=101" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (101, 22), end pos: (101, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -98,7 +98,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str / None = None, ) -&gt; bytes: """Add a robust watermark to the PDF. </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.12s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2529"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2529_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2529_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2529_1"><button class="btn btn-outline-danger"><span class="job_id">2529 : Job ID ff4a279d443b4f08b14200e497f021be</span></button></div></a><div aria-labelledby="job_list___sub_heading_2529_1" data-parent="#job_list___sub_accordion_2529" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2529_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=194" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (194, 22), end pos: (194, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -191,7 +191,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str / None = None, ) -&gt; bool: """Check if watermarking is applicable.""" if not HAS_PYMUPDF:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.06s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2530"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2530_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2530_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2530_1"><button class="btn btn-outline-danger"><span class="job_id">2530 : Job ID b3759a34765b42fd88a6a2f6fdcd0e87</span></button></div></a><div aria-labelledby="job_list___sub_heading_2530_1" data-parent="#job_list___sub_accordion_2530" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2530_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=350" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (350, 59), end pos: (350, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -347,7 +347,7 @@ # If we can't add annotations, skip fragments continue - def _extract_from_xmp(self, doc: fitz.Document) -&gt; str | None: + def _extract_from_xmp(self, doc: fitz.Document) -&gt; str / None: """Extract watermark from XMP metadata (document info implementation).""" try: metadata = doc.metadata</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.50s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2531"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2531_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2531_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2531_1"><button class="btn btn-outline-success"><span class="job_id">2531 : Job ID 5b94412dd35c4a47b260f752516a3e4a</span></button></div></a><div aria-labelledby="job_list___sub_heading_2531_1" data-parent="#job_list___sub_accordion_2531" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2531_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=375" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (375, 69), end pos: (375, 70)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -372,7 +372,7 @@ pass return None - def _extract_from_document_info(self, doc: fitz.Document) -&gt; str | None: + def _extract_from_document_info(self, doc: fitz.Document) -&gt; str / None: """Extract watermark from document info dictionary.""" try: metadata = doc.metadata</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T210758269174Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T210759370832Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 20.63s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2532"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2532_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2532_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2532_1"><button class="btn btn-outline-danger"><span class="job_id">2532 : Job ID 49c640133671445f988a735b254ed05f</span></button></div></a><div aria-labelledby="job_list___sub_heading_2532_1" data-parent="#job_list___sub_accordion_2532" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2532_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=390" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (390, 69), end pos: (390, 70)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Div, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -387,7 +387,7 @@ pass return None - def _reconstruct_from_fragments(self, doc: fitz.Document) -&gt; str | None: + def _reconstruct_from_fragments(self, doc: fitz.Document) -&gt; str / None: """Reconstruct watermark from distributed fragments.""" try: fragments = {}</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.44s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2533"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2533_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2533_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2533_1"><button class="btn btn-outline-success"><span class="job_id">2533 : Job ID 9970200174514cbcabb6f832e26ad5d5</span></button></div></a><div aria-labelledby="job_list___sub_heading_2533_1" data-parent="#job_list___sub_accordion_2533" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2533_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=100" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (100, 26), end pos: (100, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -97,7 +97,7 @@ pdf: PdfSource, secret: str, key: str, - intended_for: str | None = None, + intended_for: str // None = None, position: str | None = None, ) -&gt; bytes: """Add a robust watermark to the PDF.</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T192146931843Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T192147914935Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.82s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2534"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2534_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2534_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2534_1"><button class="btn btn-outline-success"><span class="job_id">2534 : Job ID 3d35da709c7a47839fe3f15a37e531bf</span></button></div></a><div aria-labelledby="job_list___sub_heading_2534_1" data-parent="#job_list___sub_accordion_2534" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2534_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=101" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (101, 22), end pos: (101, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -98,7 +98,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str // None = None, ) -&gt; bytes: """Add a robust watermark to the PDF. </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T143448995152Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T143450032175Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ERROR server:rmap_handler.py:245 Failed to add source PDF to database: No users exist to own RMAP base document; create a user first ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 11 failed, 3 passed, 22 warnings in 20.53s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2535"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2535_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2535_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2535_1"><button class="btn btn-outline-success"><span class="job_id">2535 : Job ID 99e674f0160e41658bec3591d59da19c</span></button></div></a><div aria-labelledby="job_list___sub_heading_2535_1" data-parent="#job_list___sub_accordion_2535" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2535_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=194" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (194, 22), end pos: (194, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -191,7 +191,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str // None = None, ) -&gt; bool: """Check if watermarking is applicable.""" if not HAS_PYMUPDF:</pre></div><div class="alert alert-secondary"><pre class="diff">...F.......... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:228: in open request = self._request_from_builder_args(args, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:200: in _request_from_builder_args return builder.get_request() ^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:764: in get_request return cls(self.get_environ()) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:688: in get_environ input_stream, content_length, boundary = stream_encode_multipart( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:130: in stream_encode_multipart write_binary(encoder.send_event(Data(data=chunk, more_data=True))) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:81: in write_binary return stream.write(s) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... 1 failed, 13 passed, 22 warnings in 19.95s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2536"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2536_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2536_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2536_1"><button class="btn btn-outline-danger"><span class="job_id">2536 : Job ID 3bcbc1e4b2314bfc8d7e98d060208b1d</span></button></div></a><div aria-labelledby="job_list___sub_heading_2536_1" data-parent="#job_list___sub_accordion_2536" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2536_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=350" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (350, 59), end pos: (350, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -347,7 +347,7 @@ # If we can't add annotations, skip fragments continue - def _extract_from_xmp(self, doc: fitz.Document) -&gt; str | None: + def _extract_from_xmp(self, doc: fitz.Document) -&gt; str // None: """Extract watermark from XMP metadata (document info implementation).""" try: metadata = doc.metadata</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.54s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2537"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2537_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2537_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2537_1"><button class="btn btn-outline-danger"><span class="job_id">2537 : Job ID eaa23ca9bae54eba8984872777edf48b</span></button></div></a><div aria-labelledby="job_list___sub_heading_2537_1" data-parent="#job_list___sub_accordion_2537" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2537_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=375" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (375, 69), end pos: (375, 70)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -372,7 +372,7 @@ pass return None - def _extract_from_document_info(self, doc: fitz.Document) -&gt; str | None: + def _extract_from_document_info(self, doc: fitz.Document) -&gt; str // None: """Extract watermark from document info dictionary.""" try: metadata = doc.metadata</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.92s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2538"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2538_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2538_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2538_1"><button class="btn btn-outline-danger"><span class="job_id">2538 : Job ID e730f5ed9fd44944acf037f00aa2eac0</span></button></div></a><div aria-labelledby="job_list___sub_heading_2538_1" data-parent="#job_list___sub_accordion_2538" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2538_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=390" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (390, 69), end pos: (390, 70)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_FloorDiv, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -387,7 +387,7 @@ pass return None - def _reconstruct_from_fragments(self, doc: fitz.Document) -&gt; str | None: + def _reconstruct_from_fragments(self, doc: fitz.Document) -&gt; str // None: """Reconstruct watermark from distributed fragments.""" try: fragments = {}</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.24s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2539"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2539_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2539_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2539_1"><button class="btn btn-outline-danger"><span class="job_id">2539 : Job ID 086383b051a247d1958c1e2aef28a31a</span></button></div></a><div aria-labelledby="job_list___sub_heading_2539_1" data-parent="#job_list___sub_accordion_2539" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2539_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=100" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (100, 26), end pos: (100, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -97,7 +97,7 @@ pdf: PdfSource, secret: str, key: str, - intended_for: str | None = None, + intended_for: str % None = None, position: str | None = None, ) -&gt; bytes: """Add a robust watermark to the PDF.</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.99s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2540"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2540_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2540_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2540_1"><button class="btn btn-outline-danger"><span class="job_id">2540 : Job ID 7e32780dd66e4cb0b158fc1ad9724cb3</span></button></div></a><div aria-labelledby="job_list___sub_heading_2540_1" data-parent="#job_list___sub_accordion_2540" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2540_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=101" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (101, 22), end pos: (101, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -98,7 +98,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str % None = None, ) -&gt; bytes: """Add a robust watermark to the PDF. </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.25s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2541"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2541_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2541_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2541_1"><button class="btn btn-outline-danger"><span class="job_id">2541 : Job ID 057aa25b74904bb7b9631e8076fa4760</span></button></div></a><div aria-labelledby="job_list___sub_heading_2541_1" data-parent="#job_list___sub_accordion_2541" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2541_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=194" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (194, 22), end pos: (194, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -191,7 +191,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str % None = None, ) -&gt; bool: """Check if watermarking is applicable.""" if not HAS_PYMUPDF:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.18s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2542"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2542_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2542_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2542_1"><button class="btn btn-outline-success"><span class="job_id">2542 : Job ID 5513ee8edfc941369ecbc6bbe37f8fb4</span></button></div></a><div aria-labelledby="job_list___sub_heading_2542_1" data-parent="#job_list___sub_accordion_2542" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2542_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=350" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (350, 59), end pos: (350, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -347,7 +347,7 @@ # If we can't add annotations, skip fragments continue - def _extract_from_xmp(self, doc: fitz.Document) -&gt; str | None: + def _extract_from_xmp(self, doc: fitz.Document) -&gt; str % None: """Extract watermark from XMP metadata (document info implementation).""" try: metadata = doc.metadata</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ee944917938a2b5a3: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.69s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2543"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2543_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2543_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2543_1"><button class="btn btn-outline-danger"><span class="job_id">2543 : Job ID 3d4ced6c2b3745cfb0cecfa035737de2</span></button></div></a><div aria-labelledby="job_list___sub_heading_2543_1" data-parent="#job_list___sub_accordion_2543" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2543_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=375" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (375, 69), end pos: (375, 70)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -372,7 +372,7 @@ pass return None - def _extract_from_document_info(self, doc: fitz.Document) -&gt; str | None: + def _extract_from_document_info(self, doc: fitz.Document) -&gt; str % None: """Extract watermark from document info dictionary.""" try: metadata = doc.metadata</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.21s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2544"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2544_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2544_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2544_1"><button class="btn btn-outline-danger"><span class="job_id">2544 : Job ID 450d78f3aa8a4657bea6704d8647dfca</span></button></div></a><div aria-labelledby="job_list___sub_heading_2544_1" data-parent="#job_list___sub_accordion_2544" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2544_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=390" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (390, 69), end pos: (390, 70)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Mod, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -387,7 +387,7 @@ pass return None - def _reconstruct_from_fragments(self, doc: fitz.Document) -&gt; str | None: + def _reconstruct_from_fragments(self, doc: fitz.Document) -&gt; str % None: """Reconstruct watermark from distributed fragments.""" try: fragments = {}</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.16s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2545"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2545_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2545_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2545_1"><button class="btn btn-outline-danger"><span class="job_id">2545 : Job ID 663bd3d81b4b481199c57f655b8f13e4</span></button></div></a><div aria-labelledby="job_list___sub_heading_2545_1" data-parent="#job_list___sub_accordion_2545" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2545_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=100" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (100, 26), end pos: (100, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -97,7 +97,7 @@ pdf: PdfSource, secret: str, key: str, - intended_for: str | None = None, + intended_for: str ** None = None, position: str | None = None, ) -&gt; bytes: """Add a robust watermark to the PDF.</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.51s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2546"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2546_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2546_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2546_1"><button class="btn btn-outline-danger"><span class="job_id">2546 : Job ID 12b01f44d00943fb9640e19a44d5d485</span></button></div></a><div aria-labelledby="job_list___sub_heading_2546_1" data-parent="#job_list___sub_accordion_2546" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2546_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=101" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (101, 22), end pos: (101, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -98,7 +98,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str ** None = None, ) -&gt; bytes: """Add a robust watermark to the PDF. </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.30s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2547"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2547_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2547_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2547_1"><button class="btn btn-outline-danger"><span class="job_id">2547 : Job ID 24458ca947e44d25a03c8c70c7739b38</span></button></div></a><div aria-labelledby="job_list___sub_heading_2547_1" data-parent="#job_list___sub_accordion_2547" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2547_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=194" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (194, 22), end pos: (194, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -191,7 +191,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str ** None = None, ) -&gt; bool: """Check if watermarking is applicable.""" if not HAS_PYMUPDF:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.10s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2548"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2548_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2548_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2548_1"><button class="btn btn-outline-success"><span class="job_id">2548 : Job ID 918f8da8b3954aed811d670f306ad683</span></button></div></a><div aria-labelledby="job_list___sub_heading_2548_1" data-parent="#job_list___sub_accordion_2548" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2548_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=350" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (350, 59), end pos: (350, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -347,7 +347,7 @@ # If we can't add annotations, skip fragments continue - def _extract_from_xmp(self, doc: fitz.Document) -&gt; str | None: + def _extract_from_xmp(self, doc: fitz.Document) -&gt; str ** None: """Extract watermark from XMP metadata (document info implementation).""" try: metadata = doc.metadata</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T195445995183Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T195446911061Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 20.00s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2549"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2549_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2549_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2549_1"><button class="btn btn-outline-success"><span class="job_id">2549 : Job ID d9b0030b9aa7438297d855c7181091ca</span></button></div></a><div aria-labelledby="job_list___sub_heading_2549_1" data-parent="#job_list___sub_accordion_2549" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2549_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=375" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (375, 69), end pos: (375, 70)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -372,7 +372,7 @@ pass return None - def _extract_from_document_info(self, doc: fitz.Document) -&gt; str | None: + def _extract_from_document_info(self, doc: fitz.Document) -&gt; str ** None: """Extract watermark from document info dictionary.""" try: metadata = doc.metadata</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e5df6ffb202ca553b: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.97s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2550"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2550_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2550_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2550_1"><button class="btn btn-outline-danger"><span class="job_id">2550 : Job ID 10bcdb775c154c529864025fb2691ba6</span></button></div></a><div aria-labelledby="job_list___sub_heading_2550_1" data-parent="#job_list___sub_accordion_2550" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2550_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=390" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (390, 69), end pos: (390, 70)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_Pow, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -387,7 +387,7 @@ pass return None - def _reconstruct_from_fragments(self, doc: fitz.Document) -&gt; str | None: + def _reconstruct_from_fragments(self, doc: fitz.Document) -&gt; str ** None: """Reconstruct watermark from distributed fragments.""" try: fragments = {}</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.58s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2551"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2551_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2551_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2551_1"><button class="btn btn-outline-danger"><span class="job_id">2551 : Job ID 815d6cfa05394cc9a994d5a130d65615</span></button></div></a><div aria-labelledby="job_list___sub_heading_2551_1" data-parent="#job_list___sub_accordion_2551" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2551_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=100" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (100, 26), end pos: (100, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -97,7 +97,7 @@ pdf: PdfSource, secret: str, key: str, - intended_for: str | None = None, + intended_for: str &gt;&gt; None = None, position: str | None = None, ) -&gt; bytes: """Add a robust watermark to the PDF.</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.22s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2552"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2552_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2552_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2552_1"><button class="btn btn-outline-danger"><span class="job_id">2552 : Job ID 05730f90d44d4d3daef11d36cd26fef2</span></button></div></a><div aria-labelledby="job_list___sub_heading_2552_1" data-parent="#job_list___sub_accordion_2552" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2552_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=101" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (101, 22), end pos: (101, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -98,7 +98,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str &gt;&gt; None = None, ) -&gt; bytes: """Add a robust watermark to the PDF. </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.49s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2553"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2553_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2553_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2553_1"><button class="btn btn-outline-danger"><span class="job_id">2553 : Job ID 5c05424438cc49b49e8de848e4d5b6ef</span></button></div></a><div aria-labelledby="job_list___sub_heading_2553_1" data-parent="#job_list___sub_accordion_2553" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2553_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=194" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (194, 22), end pos: (194, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -191,7 +191,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str &gt;&gt; None = None, ) -&gt; bool: """Check if watermarking is applicable.""" if not HAS_PYMUPDF:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.10s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2554"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2554_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2554_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2554_1"><button class="btn btn-outline-success"><span class="job_id">2554 : Job ID 8294724f03dc4dc2b9eca75d7cd2efa5</span></button></div></a><div aria-labelledby="job_list___sub_heading_2554_1" data-parent="#job_list___sub_accordion_2554" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2554_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=350" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (350, 59), end pos: (350, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -347,7 +347,7 @@ # If we can't add annotations, skip fragments continue - def _extract_from_xmp(self, doc: fitz.Document) -&gt; str | None: + def _extract_from_xmp(self, doc: fitz.Document) -&gt; str &gt;&gt; None: """Extract watermark from XMP metadata (document info implementation).""" try: metadata = doc.metadata</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T013918001313Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T013919005055Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.35s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2555"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2555_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2555_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2555_1"><button class="btn btn-outline-danger"><span class="job_id">2555 : Job ID 44a59d9204f1459a9007e1628d74a253</span></button></div></a><div aria-labelledby="job_list___sub_heading_2555_1" data-parent="#job_list___sub_accordion_2555" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2555_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=375" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (375, 69), end pos: (375, 70)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -372,7 +372,7 @@ pass return None - def _extract_from_document_info(self, doc: fitz.Document) -&gt; str | None: + def _extract_from_document_info(self, doc: fitz.Document) -&gt; str &gt;&gt; None: """Extract watermark from document info dictionary.""" try: metadata = doc.metadata</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.73s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2556"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2556_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2556_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2556_1"><button class="btn btn-outline-success"><span class="job_id">2556 : Job ID 4a28a1b772514057a3d79fc0a60fc9e0</span></button></div></a><div aria-labelledby="job_list___sub_heading_2556_1" data-parent="#job_list___sub_accordion_2556" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2556_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=390" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (390, 69), end pos: (390, 70)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_RShift, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -387,7 +387,7 @@ pass return None - def _reconstruct_from_fragments(self, doc: fitz.Document) -&gt; str | None: + def _reconstruct_from_fragments(self, doc: fitz.Document) -&gt; str &gt;&gt; None: """Reconstruct watermark from distributed fragments.""" try: fragments = {}</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T225834068124Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T225835062047Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.84s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2557"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2557_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2557_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2557_1"><button class="btn btn-outline-danger"><span class="job_id">2557 : Job ID 6d5ae75e356f4d21bb7dd4076058e25b</span></button></div></a><div aria-labelledby="job_list___sub_heading_2557_1" data-parent="#job_list___sub_accordion_2557" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2557_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=100" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (100, 26), end pos: (100, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -97,7 +97,7 @@ pdf: PdfSource, secret: str, key: str, - intended_for: str | None = None, + intended_for: str &lt;&lt; None = None, position: str | None = None, ) -&gt; bytes: """Add a robust watermark to the PDF.</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.48s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2558"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2558_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2558_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2558_1"><button class="btn btn-outline-danger"><span class="job_id">2558 : Job ID 2c389d2346a4441086b3b2364f75fc21</span></button></div></a><div aria-labelledby="job_list___sub_heading_2558_1" data-parent="#job_list___sub_accordion_2558" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2558_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=101" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (101, 22), end pos: (101, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -98,7 +98,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str &lt;&lt; None = None, ) -&gt; bytes: """Add a robust watermark to the PDF. </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.38s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2559"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2559_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2559_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2559_1"><button class="btn btn-outline-danger"><span class="job_id">2559 : Job ID c336115451de4e8ab77460bfab7c3841</span></button></div></a><div aria-labelledby="job_list___sub_heading_2559_1" data-parent="#job_list___sub_accordion_2559" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2559_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=194" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (194, 22), end pos: (194, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -191,7 +191,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str &lt;&lt; None = None, ) -&gt; bool: """Check if watermarking is applicable.""" if not HAS_PYMUPDF:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.95s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2560"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2560_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2560_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2560_1"><button class="btn btn-outline-success"><span class="job_id">2560 : Job ID e638171e9a284786a388f4fb9a26205f</span></button></div></a><div aria-labelledby="job_list___sub_heading_2560_1" data-parent="#job_list___sub_accordion_2560" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2560_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=350" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (350, 59), end pos: (350, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -347,7 +347,7 @@ # If we can't add annotations, skip fragments continue - def _extract_from_xmp(self, doc: fitz.Document) -&gt; str | None: + def _extract_from_xmp(self, doc: fitz.Document) -&gt; str &lt;&lt; None: """Extract watermark from XMP metadata (document info implementation).""" try: metadata = doc.metadata</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e2859b9ef07aed531: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 21.00s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2561"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2561_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2561_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2561_1"><button class="btn btn-outline-danger"><span class="job_id">2561 : Job ID ca3098252e404c43830171fa7c0b75da</span></button></div></a><div aria-labelledby="job_list___sub_heading_2561_1" data-parent="#job_list___sub_accordion_2561" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2561_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=375" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (375, 69), end pos: (375, 70)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -372,7 +372,7 @@ pass return None - def _extract_from_document_info(self, doc: fitz.Document) -&gt; str | None: + def _extract_from_document_info(self, doc: fitz.Document) -&gt; str &lt;&lt; None: """Extract watermark from document info dictionary.""" try: metadata = doc.metadata</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.98s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2562"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2562_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2562_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2562_1"><button class="btn btn-outline-success"><span class="job_id">2562 : Job ID 85591c248c12477b937787f5246ceb52</span></button></div></a><div aria-labelledby="job_list___sub_heading_2562_1" data-parent="#job_list___sub_accordion_2562" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2562_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=390" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (390, 69), end pos: (390, 70)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_LShift, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -387,7 +387,7 @@ pass return None - def _reconstruct_from_fragments(self, doc: fitz.Document) -&gt; str | None: + def _reconstruct_from_fragments(self, doc: fitz.Document) -&gt; str &lt;&lt; None: """Reconstruct watermark from distributed fragments.""" try: fragments = {}</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ee408fd5d4bc09e7b: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 20.57s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2563"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2563_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2563_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2563_1"><button class="btn btn-outline-danger"><span class="job_id">2563 : Job ID 3be1099548b6440bb1dcf89117052ce9</span></button></div></a><div aria-labelledby="job_list___sub_heading_2563_1" data-parent="#job_list___sub_accordion_2563" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2563_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=100" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (100, 26), end pos: (100, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -97,7 +97,7 @@ pdf: PdfSource, secret: str, key: str, - intended_for: str | None = None, + intended_for: str &amp; None = None, position: str | None = None, ) -&gt; bytes: """Add a robust watermark to the PDF.</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.90s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2564"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2564_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2564_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2564_1"><button class="btn btn-outline-danger"><span class="job_id">2564 : Job ID fc068498bd7b4f80aaeff0e384542430</span></button></div></a><div aria-labelledby="job_list___sub_heading_2564_1" data-parent="#job_list___sub_accordion_2564" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2564_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=101" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (101, 22), end pos: (101, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -98,7 +98,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str &amp; None = None, ) -&gt; bytes: """Add a robust watermark to the PDF. </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.04s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2565"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2565_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2565_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2565_1"><button class="btn btn-outline-danger"><span class="job_id">2565 : Job ID 37a2bd8a37ed461da99cf79b186cb859</span></button></div></a><div aria-labelledby="job_list___sub_heading_2565_1" data-parent="#job_list___sub_accordion_2565" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2565_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=194" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (194, 22), end pos: (194, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -191,7 +191,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str &amp; None = None, ) -&gt; bool: """Check if watermarking is applicable.""" if not HAS_PYMUPDF:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.15s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2566"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2566_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2566_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2566_1"><button class="btn btn-outline-success"><span class="job_id">2566 : Job ID a92ef923b8b84314a7f75f2fcbac1f25</span></button></div></a><div aria-labelledby="job_list___sub_heading_2566_1" data-parent="#job_list___sub_accordion_2566" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2566_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=350" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (350, 59), end pos: (350, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -347,7 +347,7 @@ # If we can't add annotations, skip fragments continue - def _extract_from_xmp(self, doc: fitz.Document) -&gt; str | None: + def _extract_from_xmp(self, doc: fitz.Document) -&gt; str &amp; None: """Extract watermark from XMP metadata (document info implementation).""" try: metadata = doc.metadata</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T201558050773Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T201559027471Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.73s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2567"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2567_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2567_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2567_1"><button class="btn btn-outline-danger"><span class="job_id">2567 : Job ID b9000b51239b43f19e07b7aeeaea3826</span></button></div></a><div aria-labelledby="job_list___sub_heading_2567_1" data-parent="#job_list___sub_accordion_2567" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2567_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=375" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (375, 69), end pos: (375, 70)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -372,7 +372,7 @@ pass return None - def _extract_from_document_info(self, doc: fitz.Document) -&gt; str | None: + def _extract_from_document_info(self, doc: fitz.Document) -&gt; str &amp; None: """Extract watermark from document info dictionary.""" try: metadata = doc.metadata</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.98s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2568"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2568_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2568_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2568_1"><button class="btn btn-outline-danger"><span class="job_id">2568 : Job ID 487ecbb51e564612a256bed20aea6f80</span></button></div></a><div aria-labelledby="job_list___sub_heading_2568_1" data-parent="#job_list___sub_accordion_2568" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2568_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=390" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (390, 69), end pos: (390, 70)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitAnd, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -387,7 +387,7 @@ pass return None - def _reconstruct_from_fragments(self, doc: fitz.Document) -&gt; str | None: + def _reconstruct_from_fragments(self, doc: fitz.Document) -&gt; str &amp; None: """Reconstruct watermark from distributed fragments.""" try: fragments = {}</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.10s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2569"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2569_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2569_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2569_1"><button class="btn btn-outline-success"><span class="job_id">2569 : Job ID 8eb99ea139234924abb13f065ad13045</span></button></div></a><div aria-labelledby="job_list___sub_heading_2569_1" data-parent="#job_list___sub_accordion_2569" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2569_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=100" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (100, 26), end pos: (100, 27)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -97,7 +97,7 @@ pdf: PdfSource, secret: str, key: str, - intended_for: str | None = None, + intended_for: str ^ None = None, position: str | None = None, ) -&gt; bytes: """Add a robust watermark to the PDF.</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T003820150735Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T003821059978Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.42s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2570"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2570_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2570_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2570_1"><button class="btn btn-outline-danger"><span class="job_id">2570 : Job ID febb1c0f8af24c23bd1ef5cbae0339e2</span></button></div></a><div aria-labelledby="job_list___sub_heading_2570_1" data-parent="#job_list___sub_accordion_2570" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2570_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=101" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (101, 22), end pos: (101, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -98,7 +98,7 @@ secret: str, key: str, intended_for: str | None = None, - position: str | None = None, + position: str ^ None = None, ) -&gt; bytes: """Add a robust watermark to the PDF. </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.54s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2571"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2571_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2571_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2571_1"><button class="btn btn-outline-success"><span class="job_id">2571 : Job ID 2ab5e33249bf450894c6eaa76323827a</span></button></div></a><div aria-labelledby="job_list___sub_heading_2571_1" data-parent="#job_list___sub_accordion_2571" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2571_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=194" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (194, 22), end pos: (194, 23)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -191,7 +191,7 @@ def is_watermark_applicable( self, pdf: PdfSource, - position: str | None = None, + position: str ^ None = None, ) -&gt; bool: """Check if watermarking is applicable.""" if not HAS_PYMUPDF:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T223501094487Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T223501902627Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.52s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2572"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2572_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2572_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2572_1"><button class="btn btn-outline-success"><span class="job_id">2572 : Job ID b3be04ede61d437ba30fbbb1f9b49421</span></button></div></a><div aria-labelledby="job_list___sub_heading_2572_1" data-parent="#job_list___sub_accordion_2572" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2572_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=350" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (350, 59), end pos: (350, 60)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -347,7 +347,7 @@ # If we can't add annotations, skip fragments continue - def _extract_from_xmp(self, doc: fitz.Document) -&gt; str | None: + def _extract_from_xmp(self, doc: fitz.Document) -&gt; str ^ None: """Extract watermark from XMP metadata (document info implementation).""" try: metadata = doc.metadata</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T142744708116Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T142745748619Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 20.35s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2573"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2573_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2573_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2573_1"><button class="btn btn-outline-danger"><span class="job_id">2573 : Job ID 6b6fe85c0d9a487abff73973a6840c6a</span></button></div></a><div aria-labelledby="job_list___sub_heading_2573_1" data-parent="#job_list___sub_accordion_2573" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2573_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=375" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (375, 69), end pos: (375, 70)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -372,7 +372,7 @@ pass return None - def _extract_from_document_info(self, doc: fitz.Document) -&gt; str | None: + def _extract_from_document_info(self, doc: fitz.Document) -&gt; str ^ None: """Extract watermark from document info dictionary.""" try: metadata = doc.metadata</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.06s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2574"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2574_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2574_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2574_1"><button class="btn btn-outline-danger"><span class="job_id">2574 : Job ID 3f0ec2de35794735bb31b34a4be7e120</span></button></div></a><div aria-labelledby="job_list___sub_heading_2574_1" data-parent="#job_list___sub_accordion_2574" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2574_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=390" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (390, 69), end pos: (390, 70)</button></a></pre><pre>operator: core/ReplaceBinaryOperator_BitOr_BitXor, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -387,7 +387,7 @@ pass return None - def _reconstruct_from_fragments(self, doc: fitz.Document) -&gt; str | None: + def _reconstruct_from_fragments(self, doc: fitz.Document) -&gt; str ^ None: """Reconstruct watermark from distributed fragments.""" try: fragments = {}</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.46s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2575"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2575_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2575_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2575_1"><button class="btn btn-outline-danger"><span class="job_id">2575 : Job ID 220bb068a0954ddcb3077327bd6c1f9f</span></button></div></a><div aria-labelledby="job_list___sub_heading_2575_1" data-parent="#job_list___sub_accordion_2575" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2575_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=148" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (148, 30), end pos: (148, 32)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_NotEq, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -145,7 +145,7 @@ try: # Ensure the PDF has at least one page for fragment embedding - if doc.page_count == 0: + if doc.page_count != 0: try: # Try to add a blank page if PDF structure allows it doc.new_page()</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.94s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2576"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2576_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2576_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2576_1"><button class="btn btn-outline-danger"><span class="job_id">2576 : Job ID 90b8750789dd4cc0a93f33a3553e2ec6</span></button></div></a><div aria-labelledby="job_list___sub_heading_2576_1" data-parent="#job_list___sub_accordion_2576" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2576_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=451" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (451, 47), end pos: (451, 49)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_NotEq, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -448,7 +448,7 @@ # Validate payload structure if ( isinstance(payload, dict) - and payload.get("version") == self._VERSION + and payload.get("version") != self._VERSION ): return payload["secret"] </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.54s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2577"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2577_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2577_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2577_1"><button class="btn btn-outline-success"><span class="job_id">2577 : Job ID a3dfdbc406fd49cd8f18f0cbdb6b5885</span></button></div></a><div aria-labelledby="job_list___sub_heading_2577_1" data-parent="#job_list___sub_accordion_2577" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2577_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=148" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (148, 30), end pos: (148, 32)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_Lt, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -145,7 +145,7 @@ try: # Ensure the PDF has at least one page for fragment embedding - if doc.page_count == 0: + if doc.page_count &lt; 0: try: # Try to add a blank page if PDF structure allows it doc.new_page()</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T154305937393Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T154306819675Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.47s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2578"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2578_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2578_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2578_1"><button class="btn btn-outline-success"><span class="job_id">2578 : Job ID caa87b61376343cbacfd6513ce20b590</span></button></div></a><div aria-labelledby="job_list___sub_heading_2578_1" data-parent="#job_list___sub_accordion_2578" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2578_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=451" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (451, 47), end pos: (451, 49)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_Lt, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -448,7 +448,7 @@ # Validate payload structure if ( isinstance(payload, dict) - and payload.get("version") == self._VERSION + and payload.get("version") &lt; self._VERSION ): return payload["secret"] </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T183219605615Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T183220604551Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 20.01s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2579"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2579_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2579_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2579_1"><button class="btn btn-outline-success"><span class="job_id">2579 : Job ID aeaa89e8c63a4b3ebaa2829285dd808c</span></button></div></a><div aria-labelledby="job_list___sub_heading_2579_1" data-parent="#job_list___sub_accordion_2579" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2579_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=148" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (148, 30), end pos: (148, 32)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_LtE, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -145,7 +145,7 @@ try: # Ensure the PDF has at least one page for fragment embedding - if doc.page_count == 0: + if doc.page_count &lt;= 0: try: # Try to add a blank page if PDF structure allows it doc.new_page()</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T001259686283Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T001300613736Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.30s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2580"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2580_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2580_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2580_1"><button class="btn btn-outline-danger"><span class="job_id">2580 : Job ID 3dbf4f1a800940c4a1300b99561c368a</span></button></div></a><div aria-labelledby="job_list___sub_heading_2580_1" data-parent="#job_list___sub_accordion_2580" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2580_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=451" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (451, 47), end pos: (451, 49)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_LtE, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -448,7 +448,7 @@ # Validate payload structure if ( isinstance(payload, dict) - and payload.get("version") == self._VERSION + and payload.get("version") &lt;= self._VERSION ): return payload["secret"] </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.96s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2581"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2581_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2581_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2581_1"><button class="btn btn-outline-danger"><span class="job_id">2581 : Job ID 2cceb6ff490b4be8860062badc8f83cd</span></button></div></a><div aria-labelledby="job_list___sub_heading_2581_1" data-parent="#job_list___sub_accordion_2581" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2581_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=148" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (148, 30), end pos: (148, 32)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_Gt, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -145,7 +145,7 @@ try: # Ensure the PDF has at least one page for fragment embedding - if doc.page_count == 0: + if doc.page_count &gt; 0: try: # Try to add a blank page if PDF structure allows it doc.new_page()</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.43s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2582"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2582_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2582_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2582_1"><button class="btn btn-outline-danger"><span class="job_id">2582 : Job ID a8797bb5ab254029b212721344bbbaab</span></button></div></a><div aria-labelledby="job_list___sub_heading_2582_1" data-parent="#job_list___sub_accordion_2582" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2582_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=451" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (451, 47), end pos: (451, 49)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_Gt, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -448,7 +448,7 @@ # Validate payload structure if ( isinstance(payload, dict) - and payload.get("version") == self._VERSION + and payload.get("version") &gt; self._VERSION ): return payload["secret"] </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.33s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2583"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2583_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2583_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2583_1"><button class="btn btn-outline-success"><span class="job_id">2583 : Job ID cd11a7f1214841b68254ba208c7f12d7</span></button></div></a><div aria-labelledby="job_list___sub_heading_2583_1" data-parent="#job_list___sub_accordion_2583" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2583_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=148" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (148, 30), end pos: (148, 32)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_GtE, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -145,7 +145,7 @@ try: # Ensure the PDF has at least one page for fragment embedding - if doc.page_count == 0: + if doc.page_count &gt;= 0: try: # Try to add a blank page if PDF structure allows it doc.new_page()</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T184658199962Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T184659232415Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 20.05s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2584"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2584_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2584_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2584_1"><button class="btn btn-outline-danger"><span class="job_id">2584 : Job ID 9becd53027804f4a8c2d615b13a5466b</span></button></div></a><div aria-labelledby="job_list___sub_heading_2584_1" data-parent="#job_list___sub_accordion_2584" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2584_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=451" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (451, 47), end pos: (451, 49)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_GtE, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -448,7 +448,7 @@ # Validate payload structure if ( isinstance(payload, dict) - and payload.get("version") == self._VERSION + and payload.get("version") &gt;= self._VERSION ): return payload["secret"] </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.03s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2585"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2585_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2585_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2585_1"><button class="btn btn-outline-success"><span class="job_id">2585 : Job ID 87094b7aa02843f19ab915a112c243fd</span></button></div></a><div aria-labelledby="job_list___sub_heading_2585_1" data-parent="#job_list___sub_accordion_2585" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2585_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=451" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (451, 47), end pos: (451, 49)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_Is, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -448,7 +448,7 @@ # Validate payload structure if ( isinstance(payload, dict) - and payload.get("version") == self._VERSION + and payload.get("version") is self._VERSION ): return payload["secret"] </pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T164007454376Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T164008417179Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.30s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2586"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2586_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2586_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2586_1"><button class="btn btn-outline-danger"><span class="job_id">2586 : Job ID 1e747819b2cf4b87a031be9376c45370</span></button></div></a><div aria-labelledby="job_list___sub_heading_2586_1" data-parent="#job_list___sub_accordion_2586" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2586_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=451" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (451, 47), end pos: (451, 49)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Eq_IsNot, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -448,7 +448,7 @@ # Validate payload structure if ( isinstance(payload, dict) - and payload.get("version") == self._VERSION + and payload.get("version") is not self._VERSION ): return payload["secret"] </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 22.64s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2587"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2587_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2587_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2587_1"><button class="btn btn-outline-danger"><span class="job_id">2587 : Job ID 4796f71038f04a3d868f225a5a7efbb8</span></button></div></a><div aria-labelledby="job_list___sub_heading_2587_1" data-parent="#job_list___sub_accordion_2587" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2587_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=167" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (167, 20), end pos: (167, 22)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_Eq, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -164,7 +164,7 @@ self._embed_in_document_info(doc, encrypted_payload, watermark_id) # Add distributed fragments (unless disabled or not possible) - if position != "metadata-only": + if position == "metadata-only": self._embed_fragments(doc, encrypted_payload, watermark_id, derived_key) # Return the watermarked PDF</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.25s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2588"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2588_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2588_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2588_1"><button class="btn btn-outline-success"><span class="job_id">2588 : Job ID b178ffff51b24795bc575d4b990d738f</span></button></div></a><div aria-labelledby="job_list___sub_heading_2588_1" data-parent="#job_list___sub_accordion_2588" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2588_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=167" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (167, 20), end pos: (167, 22)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_Lt, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -164,7 +164,7 @@ self._embed_in_document_info(doc, encrypted_payload, watermark_id) # Add distributed fragments (unless disabled or not possible) - if position != "metadata-only": + if position &lt; "metadata-only": self._embed_fragments(doc, encrypted_payload, watermark_id, derived_key) # Return the watermarked PDF</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614efd6005ce38ce8f9b: '&lt;' not supported between instances of 'NoneType' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 20.14s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2589"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2589_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2589_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2589_1"><button class="btn btn-outline-success"><span class="job_id">2589 : Job ID ac7b2651055f47a2918f52c5977ccf7f</span></button></div></a><div aria-labelledby="job_list___sub_heading_2589_1" data-parent="#job_list___sub_accordion_2589" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2589_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=167" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (167, 20), end pos: (167, 22)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_LtE, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -164,7 +164,7 @@ self._embed_in_document_info(doc, encrypted_payload, watermark_id) # Add distributed fragments (unless disabled or not possible) - if position != "metadata-only": + if position &lt;= "metadata-only": self._embed_fragments(doc, encrypted_payload, watermark_id, derived_key) # Return the watermarked PDF</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ee0ff58a11b5666ba: '&lt;=' not supported between instances of 'NoneType' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 21.07s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2590"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2590_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2590_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2590_1"><button class="btn btn-outline-success"><span class="job_id">2590 : Job ID d154a7919b9745b18d38b818036ba8e8</span></button></div></a><div aria-labelledby="job_list___sub_heading_2590_1" data-parent="#job_list___sub_accordion_2590" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2590_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=167" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (167, 20), end pos: (167, 22)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_Gt, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -164,7 +164,7 @@ self._embed_in_document_info(doc, encrypted_payload, watermark_id) # Add distributed fragments (unless disabled or not possible) - if position != "metadata-only": + if position &gt; "metadata-only": self._embed_fragments(doc, encrypted_payload, watermark_id, derived_key) # Return the watermarked PDF</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ec44886ac674bad01: '&gt;' not supported between instances of 'NoneType' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 21.29s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2591"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2591_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2591_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2591_1"><button class="btn btn-outline-success"><span class="job_id">2591 : Job ID 973e549ea9e445dc8f05012a1efa18f6</span></button></div></a><div aria-labelledby="job_list___sub_heading_2591_1" data-parent="#job_list___sub_accordion_2591" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2591_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=167" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (167, 20), end pos: (167, 22)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_GtE, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -164,7 +164,7 @@ self._embed_in_document_info(doc, encrypted_payload, watermark_id) # Add distributed fragments (unless disabled or not possible) - if position != "metadata-only": + if position &gt;= "metadata-only": self._embed_fragments(doc, encrypted_payload, watermark_id, derived_key) # Return the watermarked PDF</pre></div><div class="alert alert-secondary"><pre class="diff">.............F [100%] ================================== FAILURES =================================== _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614eccdc943d13ac221e: '&gt;=' not supported between instances of 'NoneType' and 'str' ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 1 failed, 13 passed, 22 warnings in 20.57s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2592"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2592_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2592_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2592_1"><button class="btn btn-outline-danger"><span class="job_id">2592 : Job ID 50470ae4770246f69b0c0dc715e1146e</span></button></div></a><div aria-labelledby="job_list___sub_heading_2592_1" data-parent="#job_list___sub_accordion_2592" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2592_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=167" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (167, 20), end pos: (167, 22)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_Is, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -164,7 +164,7 @@ self._embed_in_document_info(doc, encrypted_payload, watermark_id) # Add distributed fragments (unless disabled or not possible) - if position != "metadata-only": + if position is "metadata-only": self._embed_fragments(doc, encrypted_payload, watermark_id, derived_key) # Return the watermarked PDF</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr robust_xmp_watermark.py:167 C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\robust_xmp_watermark.py:167: SyntaxWarning: "is" with 'str' literal. Did you mean "=="? if position is "metadata-only": &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 23 warnings in 21.06s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2593"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2593_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2593_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2593_1"><button class="btn btn-outline-danger"><span class="job_id">2593 : Job ID 49d5f9785f194eba9442af277619d91e</span></button></div></a><div aria-labelledby="job_list___sub_heading_2593_1" data-parent="#job_list___sub_accordion_2593" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2593_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=167" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (167, 20), end pos: (167, 22)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_NotEq_IsNot, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -164,7 +164,7 @@ self._embed_in_document_info(doc, encrypted_payload, watermark_id) # Add distributed fragments (unless disabled or not possible) - if position != "metadata-only": + if position is not "metadata-only": self._embed_fragments(doc, encrypted_payload, watermark_id, derived_key) # Return the watermarked PDF</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr robust_xmp_watermark.py:167 C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\robust_xmp_watermark.py:167: SyntaxWarning: "is not" with 'str' literal. Did you mean "!="? if position is not "metadata-only": &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 23 warnings in 20.17s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2594"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2594_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2594_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2594_1"><button class="btn btn-outline-danger"><span class="job_id">2594 : Job ID c00be65a999b492a8a1d4d55c6c3b8a7</span></button></div></a><div aria-labelledby="job_list___sub_heading_2594_1" data-parent="#job_list___sub_accordion_2594" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2594_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=337" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (337, 34), end pos: (337, 35)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_Eq, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -334,7 +334,7 @@ # Add fragments to PDF as annotations or form fields for _i, fragment in enumerate(fragments): try: - if doc.page_count &gt; 0: + if doc.page_count == 0: page = doc.load_page(0) # Use first page # Create invisible annotation with fragment data</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.95s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2595"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2595_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2595_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2595_1"><button class="btn btn-outline-danger"><span class="job_id">2595 : Job ID e82d574d68714058b89480e1bb542399</span></button></div></a><div aria-labelledby="job_list___sub_heading_2595_1" data-parent="#job_list___sub_accordion_2595" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2595_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=337" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (337, 34), end pos: (337, 35)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_NotEq, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -334,7 +334,7 @@ # Add fragments to PDF as annotations or form fields for _i, fragment in enumerate(fragments): try: - if doc.page_count &gt; 0: + if doc.page_count != 0: page = doc.load_page(0) # Use first page # Create invisible annotation with fragment data</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.58s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2596"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2596_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2596_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2596_1"><button class="btn btn-outline-success"><span class="job_id">2596 : Job ID 1d8e67b6e8d44aef84cc6cc986ec3aac</span></button></div></a><div aria-labelledby="job_list___sub_heading_2596_1" data-parent="#job_list___sub_accordion_2596" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2596_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=337" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (337, 34), end pos: (337, 35)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_Lt, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -334,7 +334,7 @@ # Add fragments to PDF as annotations or form fields for _i, fragment in enumerate(fragments): try: - if doc.page_count &gt; 0: + if doc.page_count &lt; 0: page = doc.load_page(0) # Use first page # Create invisible annotation with fragment data</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e77ed73ca73b6ae81: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 20.87s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2597"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2597_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2597_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2597_1"><button class="btn btn-outline-danger"><span class="job_id">2597 : Job ID e25d8be84b3e4b99be2024d5ce38bc21</span></button></div></a><div aria-labelledby="job_list___sub_heading_2597_1" data-parent="#job_list___sub_accordion_2597" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2597_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=337" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (337, 34), end pos: (337, 35)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_LtE, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -334,7 +334,7 @@ # Add fragments to PDF as annotations or form fields for _i, fragment in enumerate(fragments): try: - if doc.page_count &gt; 0: + if doc.page_count &lt;= 0: page = doc.load_page(0) # Use first page # Create invisible annotation with fragment data</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.11s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2598"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2598_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2598_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2598_1"><button class="btn btn-outline-success"><span class="job_id">2598 : Job ID d7cc855664e44cd6a6c5632960273c11</span></button></div></a><div aria-labelledby="job_list___sub_heading_2598_1" data-parent="#job_list___sub_accordion_2598" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2598_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=337" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (337, 34), end pos: (337, 35)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_Gt_GtE, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -334,7 +334,7 @@ # Add fragments to PDF as annotations or form fields for _i, fragment in enumerate(fragments): try: - if doc.page_count &gt; 0: + if doc.page_count &gt;= 0: page = doc.load_page(0) # Use first page # Create invisible annotation with fragment data</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ef742719bc8ac71a1: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 21.32s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2599"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2599_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2599_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2599_1"><button class="btn btn-outline-success"><span class="job_id">2599 : Job ID e5473f9b467943dab4e2579be07ca78a</span></button></div></a><div aria-labelledby="job_list___sub_heading_2599_1" data-parent="#job_list___sub_accordion_2599" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2599_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=365" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (365, 34), end pos: (365, 36)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_GtE_Eq, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -362,7 +362,7 @@ # Try subject first (partial payload with watermark ID) if "tw-" in subject: parts = subject.split("-", 2) # tw-&lt;id&gt;-&lt;payload&gt; - if len(parts) &gt;= 3: + if len(parts) == 3: return parts[2] # The encrypted payload part # Fallback to title (full payload)</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e156e53e53f233137: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.69s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2600"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2600_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2600_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2600_1"><button class="btn btn-outline-danger"><span class="job_id">2600 : Job ID bbf39c6325a444ef8ad674431208ef57</span></button></div></a><div aria-labelledby="job_list___sub_heading_2600_1" data-parent="#job_list___sub_accordion_2600" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2600_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=408" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (408, 42), end pos: (408, 44)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_GtE_Eq, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -405,7 +405,7 @@ if author.startswith("tw-") and content: # Extract fragment index parts = author.split("-") - if len(parts) &gt;= 2: + if len(parts) == 2: try: fragment_idx = int(parts[1]) fragments[fragment_idx] = base64.b64decode(content)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.05s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2601"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2601_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2601_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2601_1"><button class="btn btn-outline-danger"><span class="job_id">2601 : Job ID 57d1f8c22510477a9f9812effd9efcde</span></button></div></a><div aria-labelledby="job_list___sub_heading_2601_1" data-parent="#job_list___sub_accordion_2601" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2601_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=418" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (418, 30), end pos: (418, 32)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_GtE_Eq, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -415,7 +415,7 @@ continue # Reconstruct payload from fragments - if len(fragments) &gt;= self._MIN_FRAGMENTS: + if len(fragments) == self._MIN_FRAGMENTS: reconstructed = b"" for i in sorted(fragments.keys()): reconstructed += fragments[i]</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.08s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2602"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2602_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2602_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2602_1"><button class="btn btn-outline-success"><span class="job_id">2602 : Job ID 3e4e48abe9c24bb58450eb883029c5a5</span></button></div></a><div aria-labelledby="job_list___sub_heading_2602_1" data-parent="#job_list___sub_accordion_2602" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2602_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=434" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (434, 35), end pos: (434, 37)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_GtE_Eq, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -431,7 +431,7 @@ # Try to extract salt from the encrypted payload encrypted_data = base64.b64decode(encrypted_payload) - if len(encrypted_data) &gt;= self._SALT_SIZE + 12: + if len(encrypted_data) == self._SALT_SIZE + 12: # Extract salt from beginning of encrypted data salt = encrypted_data[: self._SALT_SIZE] nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE + 12]</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T204059273083Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T204100189560Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 20.25s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2603"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2603_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2603_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2603_1"><button class="btn btn-outline-success"><span class="job_id">2603 : Job ID 1b58812b684a4975a2f4bb57d9576586</span></button></div></a><div aria-labelledby="job_list___sub_heading_2603_1" data-parent="#job_list___sub_accordion_2603" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2603_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=365" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (365, 34), end pos: (365, 36)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_GtE_NotEq, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -362,7 +362,7 @@ # Try subject first (partial payload with watermark ID) if "tw-" in subject: parts = subject.split("-", 2) # tw-&lt;id&gt;-&lt;payload&gt; - if len(parts) &gt;= 3: + if len(parts) != 3: return parts[2] # The encrypted payload part # Fallback to title (full payload)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T042251103301Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T042252531436Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 22.28s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2604"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2604_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2604_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2604_1"><button class="btn btn-outline-success"><span class="job_id">2604 : Job ID d19fa6eaa4af490ca6cba3f848108aa4</span></button></div></a><div aria-labelledby="job_list___sub_heading_2604_1" data-parent="#job_list___sub_accordion_2604" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2604_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=408" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (408, 42), end pos: (408, 44)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_GtE_NotEq, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -405,7 +405,7 @@ if author.startswith("tw-") and content: # Extract fragment index parts = author.split("-") - if len(parts) &gt;= 2: + if len(parts) != 2: try: fragment_idx = int(parts[1]) fragments[fragment_idx] = base64.b64decode(content)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T034304344922Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T034305197286Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 20.35s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2605"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2605_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2605_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2605_1"><button class="btn btn-outline-success"><span class="job_id">2605 : Job ID 8f85622a1f644b109c484d30cb75bb2b</span></button></div></a><div aria-labelledby="job_list___sub_heading_2605_1" data-parent="#job_list___sub_accordion_2605" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2605_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=418" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (418, 30), end pos: (418, 32)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_GtE_NotEq, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -415,7 +415,7 @@ continue # Reconstruct payload from fragments - if len(fragments) &gt;= self._MIN_FRAGMENTS: + if len(fragments) != self._MIN_FRAGMENTS: reconstructed = b"" for i in sorted(fragments.keys()): reconstructed += fragments[i]</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T233334576825Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T233335488579Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.38s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2606"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2606_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2606_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2606_1"><button class="btn btn-outline-success"><span class="job_id">2606 : Job ID c5dc4af0f9d64c718084a8818f824d83</span></button></div></a><div aria-labelledby="job_list___sub_heading_2606_1" data-parent="#job_list___sub_accordion_2606" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2606_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=434" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (434, 35), end pos: (434, 37)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_GtE_NotEq, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -431,7 +431,7 @@ # Try to extract salt from the encrypted payload encrypted_data = base64.b64decode(encrypted_payload) - if len(encrypted_data) &gt;= self._SALT_SIZE + 12: + if len(encrypted_data) != self._SALT_SIZE + 12: # Extract salt from beginning of encrypted data salt = encrypted_data[: self._SALT_SIZE] nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE + 12]</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T031334690138Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T031335794990Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 20.07s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2607"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2607_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2607_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2607_1"><button class="btn btn-outline-danger"><span class="job_id">2607 : Job ID 49d6fe14f766482db331b37ccc0f3e0d</span></button></div></a><div aria-labelledby="job_list___sub_heading_2607_1" data-parent="#job_list___sub_accordion_2607" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2607_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=365" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (365, 34), end pos: (365, 36)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_GtE_Lt, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -362,7 +362,7 @@ # Try subject first (partial payload with watermark ID) if "tw-" in subject: parts = subject.split("-", 2) # tw-&lt;id&gt;-&lt;payload&gt; - if len(parts) &gt;= 3: + if len(parts) &lt; 3: return parts[2] # The encrypted payload part # Fallback to title (full payload)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.33s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2608"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2608_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2608_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2608_1"><button class="btn btn-outline-success"><span class="job_id">2608 : Job ID cbafeb6fb4044b94a6218457ec90c516</span></button></div></a><div aria-labelledby="job_list___sub_heading_2608_1" data-parent="#job_list___sub_accordion_2608" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2608_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=408" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (408, 42), end pos: (408, 44)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_GtE_Lt, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -405,7 +405,7 @@ if author.startswith("tw-") and content: # Extract fragment index parts = author.split("-") - if len(parts) &gt;= 2: + if len(parts) &lt; 2: try: fragment_idx = int(parts[1]) fragments[fragment_idx] = base64.b64decode(content)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T030354793817Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T030355674521Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.25s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2609"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2609_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2609_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2609_1"><button class="btn btn-outline-success"><span class="job_id">2609 : Job ID 3dc463727b1745d0a4a9dcffe8418cae</span></button></div></a><div aria-labelledby="job_list___sub_heading_2609_1" data-parent="#job_list___sub_accordion_2609" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2609_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=418" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (418, 30), end pos: (418, 32)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_GtE_Lt, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -415,7 +415,7 @@ continue # Reconstruct payload from fragments - if len(fragments) &gt;= self._MIN_FRAGMENTS: + if len(fragments) &lt; self._MIN_FRAGMENTS: reconstructed = b"" for i in sorted(fragments.keys()): reconstructed += fragments[i]</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T203243578700Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T203244499255Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.51s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2610"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2610_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2610_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2610_1"><button class="btn btn-outline-success"><span class="job_id">2610 : Job ID 9b5e0af5aa684652804201f5a315094e</span></button></div></a><div aria-labelledby="job_list___sub_heading_2610_1" data-parent="#job_list___sub_accordion_2610" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2610_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=434" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (434, 35), end pos: (434, 37)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_GtE_Lt, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -431,7 +431,7 @@ # Try to extract salt from the encrypted payload encrypted_data = base64.b64decode(encrypted_payload) - if len(encrypted_data) &gt;= self._SALT_SIZE + 12: + if len(encrypted_data) &lt; self._SALT_SIZE + 12: # Extract salt from beginning of encrypted data salt = encrypted_data[: self._SALT_SIZE] nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE + 12]</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e7e3fe419b3ae864b: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.70s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2611"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2611_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2611_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2611_1"><button class="btn btn-outline-danger"><span class="job_id">2611 : Job ID 98ee79b440554544b5f56aa1fde32fdc</span></button></div></a><div aria-labelledby="job_list___sub_heading_2611_1" data-parent="#job_list___sub_accordion_2611" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2611_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=365" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (365, 34), end pos: (365, 36)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_GtE_LtE, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -362,7 +362,7 @@ # Try subject first (partial payload with watermark ID) if "tw-" in subject: parts = subject.split("-", 2) # tw-&lt;id&gt;-&lt;payload&gt; - if len(parts) &gt;= 3: + if len(parts) &lt;= 3: return parts[2] # The encrypted payload part # Fallback to title (full payload)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.87s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2612"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2612_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2612_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2612_1"><button class="btn btn-outline-success"><span class="job_id">2612 : Job ID bf14e35af6fd4982a65195197316467c</span></button></div></a><div aria-labelledby="job_list___sub_heading_2612_1" data-parent="#job_list___sub_accordion_2612" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2612_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=408" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (408, 42), end pos: (408, 44)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_GtE_LtE, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -405,7 +405,7 @@ if author.startswith("tw-") and content: # Extract fragment index parts = author.split("-") - if len(parts) &gt;= 2: + if len(parts) &lt;= 2: try: fragment_idx = int(parts[1]) fragments[fragment_idx] = base64.b64decode(content)</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.. [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 4 failed, 10 passed, 22 warnings in 19.66s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2613"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2613_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2613_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2613_1"><button class="btn btn-outline-danger"><span class="job_id">2613 : Job ID fc7b3c4a7c21406787b989519da778da</span></button></div></a><div aria-labelledby="job_list___sub_heading_2613_1" data-parent="#job_list___sub_accordion_2613" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2613_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=418" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (418, 30), end pos: (418, 32)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_GtE_LtE, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -415,7 +415,7 @@ continue # Reconstruct payload from fragments - if len(fragments) &gt;= self._MIN_FRAGMENTS: + if len(fragments) &lt;= self._MIN_FRAGMENTS: reconstructed = b"" for i in sorted(fragments.keys()): reconstructed += fragments[i]</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.56s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2614"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2614_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2614_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2614_1"><button class="btn btn-outline-danger"><span class="job_id">2614 : Job ID bcc19a539f8446128a3ce3dc59a78858</span></button></div></a><div aria-labelledby="job_list___sub_heading_2614_1" data-parent="#job_list___sub_accordion_2614" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2614_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=434" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (434, 35), end pos: (434, 37)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_GtE_LtE, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -431,7 +431,7 @@ # Try to extract salt from the encrypted payload encrypted_data = base64.b64decode(encrypted_payload) - if len(encrypted_data) &gt;= self._SALT_SIZE + 12: + if len(encrypted_data) &lt;= self._SALT_SIZE + 12: # Extract salt from beginning of encrypted data salt = encrypted_data[: self._SALT_SIZE] nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE + 12]</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 22.02s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2615"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2615_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2615_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2615_1"><button class="btn btn-outline-danger"><span class="job_id">2615 : Job ID 34181aecb35b434f9f59ae5268002371</span></button></div></a><div aria-labelledby="job_list___sub_heading_2615_1" data-parent="#job_list___sub_accordion_2615" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2615_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=365" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (365, 34), end pos: (365, 36)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_GtE_Gt, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -362,7 +362,7 @@ # Try subject first (partial payload with watermark ID) if "tw-" in subject: parts = subject.split("-", 2) # tw-&lt;id&gt;-&lt;payload&gt; - if len(parts) &gt;= 3: + if len(parts) &gt; 3: return parts[2] # The encrypted payload part # Fallback to title (full payload)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.76s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2616"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2616_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2616_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2616_1"><button class="btn btn-outline-success"><span class="job_id">2616 : Job ID 8fc77220359b4a1ab951a2e39ee7ea9d</span></button></div></a><div aria-labelledby="job_list___sub_heading_2616_1" data-parent="#job_list___sub_accordion_2616" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2616_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=408" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (408, 42), end pos: (408, 44)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_GtE_Gt, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -405,7 +405,7 @@ if author.startswith("tw-") and content: # Extract fragment index parts = author.split("-") - if len(parts) &gt;= 2: + if len(parts) &gt; 2: try: fragment_idx = int(parts[1]) fragments[fragment_idx] = base64.b64decode(content)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T024731056978Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T024731989348Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.28s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2617"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2617_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2617_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2617_1"><button class="btn btn-outline-danger"><span class="job_id">2617 : Job ID 24862e8bca1947ebb143726c4660ac5a</span></button></div></a><div aria-labelledby="job_list___sub_heading_2617_1" data-parent="#job_list___sub_accordion_2617" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2617_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=418" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (418, 30), end pos: (418, 32)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_GtE_Gt, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -415,7 +415,7 @@ continue # Reconstruct payload from fragments - if len(fragments) &gt;= self._MIN_FRAGMENTS: + if len(fragments) &gt; self._MIN_FRAGMENTS: reconstructed = b"" for i in sorted(fragments.keys()): reconstructed += fragments[i]</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.37s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2618"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2618_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2618_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2618_1"><button class="btn btn-outline-success"><span class="job_id">2618 : Job ID 774ac39ee09c41d79e083f2b8cc04ba6</span></button></div></a><div aria-labelledby="job_list___sub_heading_2618_1" data-parent="#job_list___sub_accordion_2618" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2618_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=434" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (434, 35), end pos: (434, 37)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_GtE_Gt, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -431,7 +431,7 @@ # Try to extract salt from the encrypted payload encrypted_data = base64.b64decode(encrypted_payload) - if len(encrypted_data) &gt;= self._SALT_SIZE + 12: + if len(encrypted_data) &gt; self._SALT_SIZE + 12: # Extract salt from beginning of encrypted data salt = encrypted_data[: self._SALT_SIZE] nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE + 12]</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T042735139303Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T042736554582Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 21.20s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2619"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2619_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2619_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2619_1"><button class="btn btn-outline-danger"><span class="job_id">2619 : Job ID 1db0b55b03044f6cacb51363efc984d4</span></button></div></a><div aria-labelledby="job_list___sub_heading_2619_1" data-parent="#job_list___sub_accordion_2619" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2619_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=418" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (418, 30), end pos: (418, 32)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_GtE_Is, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -415,7 +415,7 @@ continue # Reconstruct payload from fragments - if len(fragments) &gt;= self._MIN_FRAGMENTS: + if len(fragments) is self._MIN_FRAGMENTS: reconstructed = b"" for i in sorted(fragments.keys()): reconstructed += fragments[i]</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.08s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2620"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2620_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2620_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2620_1"><button class="btn btn-outline-success"><span class="job_id">2620 : Job ID 90d52adc10e949a3b876c907551f9b73</span></button></div></a><div aria-labelledby="job_list___sub_heading_2620_1" data-parent="#job_list___sub_accordion_2620" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2620_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=434" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (434, 35), end pos: (434, 37)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_GtE_Is, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -431,7 +431,7 @@ # Try to extract salt from the encrypted payload encrypted_data = base64.b64decode(encrypted_payload) - if len(encrypted_data) &gt;= self._SALT_SIZE + 12: + if len(encrypted_data) is self._SALT_SIZE + 12: # Extract salt from beginning of encrypted data salt = encrypted_data[: self._SALT_SIZE] nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE + 12]</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T190137217751Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T190138179484Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.98s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2621"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2621_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2621_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2621_1"><button class="btn btn-outline-success"><span class="job_id">2621 : Job ID 000d8aa15df24411b7d55bbe63f83582</span></button></div></a><div aria-labelledby="job_list___sub_heading_2621_1" data-parent="#job_list___sub_accordion_2621" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2621_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=418" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (418, 30), end pos: (418, 32)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_GtE_IsNot, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -415,7 +415,7 @@ continue # Reconstruct payload from fragments - if len(fragments) &gt;= self._MIN_FRAGMENTS: + if len(fragments) is not self._MIN_FRAGMENTS: reconstructed = b"" for i in sorted(fragments.keys()): reconstructed += fragments[i]</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%]</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2622"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2622_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2622_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2622_1"><button class="btn btn-outline-danger"><span class="job_id">2622 : Job ID ee11347936bf450190749e6980569f23</span></button></div></a><div aria-labelledby="job_list___sub_heading_2622_1" data-parent="#job_list___sub_accordion_2622" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2622_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=434" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (434, 35), end pos: (434, 37)</button></a></pre><pre>operator: core/ReplaceComparisonOperator_GtE_IsNot, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -431,7 +431,7 @@ # Try to extract salt from the encrypted payload encrypted_data = base64.b64decode(encrypted_payload) - if len(encrypted_data) &gt;= self._SALT_SIZE + 12: + if len(encrypted_data) is not self._SALT_SIZE + 12: # Extract salt from beginning of encrypted data salt = encrypted_data[: self._SALT_SIZE] nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE + 12]</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.03s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2623"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2623_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2623_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2623_1"><button class="btn btn-outline-success"><span class="job_id">2623 : Job ID a6a6d05c2d66457580a3f916fbf78eb1</span></button></div></a><div aria-labelledby="job_list___sub_heading_2623_1" data-parent="#job_list___sub_accordion_2623" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2623_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=114" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (114, 11), end pos: (114, 14)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -111,7 +111,7 @@ Returns: Watermarked PDF as bytes """ - if not HAS_PYMUPDF: + if HAS_PYMUPDF: raise WatermarkingError("PyMuPDF is required for robust XMP watermarking") data = load_pdf_bytes(pdf)</pre></div><div class="alert alert-secondary"><pre class="diff">.........F...F [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1034 Watermarking failed for document 1 using method robust-xmp: PyMuPDF is required for robust XMP watermarking _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ef13abb2374fd2376: PyMuPDF is required for robust XMP watermarking ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 2 failed, 12 passed, 22 warnings in 20.97s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2624"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2624_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2624_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2624_1"><button class="btn btn-outline-success"><span class="job_id">2624 : Job ID 4cc34db90c4c465998aca52eaf326022</span></button></div></a><div aria-labelledby="job_list___sub_heading_2624_1" data-parent="#job_list___sub_accordion_2624" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2624_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=118" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (118, 11), end pos: (118, 14)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -115,7 +115,7 @@ raise WatermarkingError("PyMuPDF is required for robust XMP watermarking") data = load_pdf_bytes(pdf) - if not secret.strip(): + if secret.strip(): raise ValueError("Secret must be a non-empty string") if not key.strip(): raise ValueError("Key must be a non-empty string")</pre></div><div class="alert alert-secondary"><pre class="diff">.........F...F [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1034 Watermarking failed for document 1 using method robust-xmp: Secret must be a non-empty string _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ec1f8ac5d74a40075: Secret must be a non-empty string ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 2 failed, 12 passed, 22 warnings in 19.90s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2625"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2625_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2625_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2625_1"><button class="btn btn-outline-success"><span class="job_id">2625 : Job ID 9d91a45d5f7442b9a4265617a344e5e6</span></button></div></a><div aria-labelledby="job_list___sub_heading_2625_1" data-parent="#job_list___sub_accordion_2625" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2625_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=120" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (120, 11), end pos: (120, 14)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -117,7 +117,7 @@ data = load_pdf_bytes(pdf) if not secret.strip(): raise ValueError("Secret must be a non-empty string") - if not key.strip(): + if key.strip(): raise ValueError("Key must be a non-empty string") # Generate watermark components</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%]</pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2626"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2626_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2626_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2626_1"><button class="btn btn-outline-success"><span class="job_id">2626 : Job ID 1b09c0786e07453f88a65b787fa879bb</span></button></div></a><div aria-labelledby="job_list___sub_heading_2626_1" data-parent="#job_list___sub_accordion_2626" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2626_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=197" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (197, 11), end pos: (197, 14)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -194,7 +194,7 @@ position: str | None = None, ) -&gt; bool: """Check if watermarking is applicable.""" - if not HAS_PYMUPDF: + if HAS_PYMUPDF: return False try:</pre></div><div class="alert alert-secondary"><pre class="diff">.........F...F [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 47 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 2 failed, 12 passed, 22 warnings in 20.17s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2627"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2627_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2627_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2627_1"><button class="btn btn-outline-success"><span class="job_id">2627 : Job ID 6544020450074c90906387c42efc62e2</span></button></div></a><div aria-labelledby="job_list___sub_heading_2627_1" data-parent="#job_list___sub_accordion_2627" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2627_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=222" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (222, 11), end pos: (222, 14)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -219,7 +219,7 @@ SecretNotFoundError: If no watermark is found InvalidKeyError: If key is incorrect """ - if not HAS_PYMUPDF: + if HAS_PYMUPDF: raise WatermarkingError("PyMuPDF is required for robust XMP watermarking") data = load_pdf_bytes(pdf)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T225138835238Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T225139653477Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.60s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2628"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2628_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2628_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2628_1"><button class="btn btn-outline-danger"><span class="job_id">2628 : Job ID 25944bdb870c4281b4061ed260a83a23</span></button></div></a><div aria-labelledby="job_list___sub_heading_2628_1" data-parent="#job_list___sub_accordion_2628" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2628_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=226" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (226, 11), end pos: (226, 14)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -223,7 +223,7 @@ raise WatermarkingError("PyMuPDF is required for robust XMP watermarking") data = load_pdf_bytes(pdf) - if not key.strip(): + if key.strip(): raise ValueError("Key must be a non-empty string") doc = fitz.open(stream=data, filetype="pdf")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.22s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2629"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2629_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2629_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2629_1"><button class="btn btn-outline-success"><span class="job_id">2629 : Job ID c0a2014a0fbf4a27980968e1886097c9</span></button></div></a><div aria-labelledby="job_list___sub_heading_2629_1" data-parent="#job_list___sub_accordion_2629" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2629_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=235" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (235, 15), end pos: (235, 18)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -232,7 +232,7 @@ # Try to read from document info first (more reliable for full payload) encrypted_payload = self._extract_from_document_info(doc) - if not encrypted_payload: + if encrypted_payload: # Fallback to XMP metadata encrypted_payload = self._extract_from_xmp(doc) </pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T233113722841Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T233114706266Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.58s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2630"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2630_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2630_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2630_1"><button class="btn btn-outline-danger"><span class="job_id">2630 : Job ID 9e04923ecc254030ae881e55ff8d58d3</span></button></div></a><div aria-labelledby="job_list___sub_heading_2630_1" data-parent="#job_list___sub_accordion_2630" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2630_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=239" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (239, 15), end pos: (239, 18)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -236,7 +236,7 @@ # Fallback to XMP metadata encrypted_payload = self._extract_from_xmp(doc) - if not encrypted_payload: + if encrypted_payload: # Last resort: try to reconstruct from fragments encrypted_payload = self._reconstruct_from_fragments(doc) </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.64s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2631"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2631_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2631_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2631_1"><button class="btn btn-outline-danger"><span class="job_id">2631 : Job ID 17f2eb68f95b4d4c925b6ee371b12aa3</span></button></div></a><div aria-labelledby="job_list___sub_heading_2631_1" data-parent="#job_list___sub_accordion_2631" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2631_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=243" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (243, 15), end pos: (243, 18)</button></a></pre><pre>operator: core/ReplaceUnaryOperator_Delete_Not, occurrence: 8</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -240,7 +240,7 @@ # Last resort: try to reconstruct from fragments encrypted_payload = self._reconstruct_from_fragments(doc) - if not encrypted_payload: + if encrypted_payload: raise SecretNotFoundError("No robust XMP watermark found in PDF") # Decrypt and extract secret</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.91s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2632"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2632_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2632_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2632_1"><button class="btn btn-outline-success"><span class="job_id">2632 : Job ID 03e30eb68e134c31b5a593bb3d01904c</span></button></div></a><div aria-labelledby="job_list___sub_heading_2632_1" data-parent="#job_list___sub_accordion_2632" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2632_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=114" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (114, 11), end pos: (114, 26)</button></a></pre><pre>operator: core/AddNot, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -111,7 +111,7 @@ Returns: Watermarked PDF as bytes """ - if not HAS_PYMUPDF: + if not not HAS_PYMUPDF: raise WatermarkingError("PyMuPDF is required for robust XMP watermarking") data = load_pdf_bytes(pdf)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T050241945004Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T050242937178Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ebb4f41fc5fe6c0bd: PyMuPDF is required for robust XMP watermarking ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 9 failed, 5 passed, 22 warnings in 20.69s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2633"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2633_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2633_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2633_1"><button class="btn btn-outline-success"><span class="job_id">2633 : Job ID a26f830851294283a023288fbbe15a55</span></button></div></a><div aria-labelledby="job_list___sub_heading_2633_1" data-parent="#job_list___sub_accordion_2633" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2633_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=118" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (118, 11), end pos: (118, 29)</button></a></pre><pre>operator: core/AddNot, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -115,7 +115,7 @@ raise WatermarkingError("PyMuPDF is required for robust XMP watermarking") data = load_pdf_bytes(pdf) - if not secret.strip(): + if not not secret.strip(): raise ValueError("Secret must be a non-empty string") if not key.strip(): raise ValueError("Key must be a non-empty string")</pre></div><div class="alert alert-secondary"><pre class="diff">.........F...F [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1034 Watermarking failed for document 1 using method robust-xmp: Secret must be a non-empty string _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e8953295ae1590ad2: Secret must be a non-empty string ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 2 failed, 12 passed, 22 warnings in 20.07s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2634"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2634_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2634_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2634_1"><button class="btn btn-outline-success"><span class="job_id">2634 : Job ID 1c193c84b73d4fa28e1c71392c54c0dc</span></button></div></a><div aria-labelledby="job_list___sub_heading_2634_1" data-parent="#job_list___sub_accordion_2634" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2634_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=120" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (120, 11), end pos: (120, 26)</button></a></pre><pre>operator: core/AddNot, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -117,7 +117,7 @@ data = load_pdf_bytes(pdf) if not secret.strip(): raise ValueError("Secret must be a non-empty string") - if not key.strip(): + if not not key.strip(): raise ValueError("Key must be a non-empty string") # Generate watermark components</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T050428348952Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T050429250395Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ef425e4b052315b45: Key must be a non-empty string ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 9 failed, 5 passed, 22 warnings in 19.74s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2635"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2635_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2635_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2635_1"><button class="btn btn-outline-danger"><span class="job_id">2635 : Job ID 164eee87254d469aa29e9c5d3699cf7b</span></button></div></a><div aria-labelledby="job_list___sub_heading_2635_1" data-parent="#job_list___sub_accordion_2635" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2635_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=148" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (148, 15), end pos: (148, 34)</button></a></pre><pre>operator: core/AddNot, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -145,7 +145,7 @@ try: # Ensure the PDF has at least one page for fragment embedding - if doc.page_count == 0: + if not doc.page_count == 0: try: # Try to add a blank page if PDF structure allows it doc.new_page()</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.18s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2636"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2636_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2636_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2636_1"><button class="btn btn-outline-danger"><span class="job_id">2636 : Job ID da3f9996b6fd4b2296ec9e64fe2b15ac</span></button></div></a><div aria-labelledby="job_list___sub_heading_2636_1" data-parent="#job_list___sub_accordion_2636" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2636_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=167" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (167, 11), end pos: (167, 38)</button></a></pre><pre>operator: core/AddNot, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -164,7 +164,7 @@ self._embed_in_document_info(doc, encrypted_payload, watermark_id) # Add distributed fragments (unless disabled or not possible) - if position != "metadata-only": + if not position != "metadata-only": self._embed_fragments(doc, encrypted_payload, watermark_id, derived_key) # Return the watermarked PDF</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.22s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2637"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2637_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2637_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2637_1"><button class="btn btn-outline-danger"><span class="job_id">2637 : Job ID d5d112ff3b064b3a873e3ea573bc428f</span></button></div></a><div aria-labelledby="job_list___sub_heading_2637_1" data-parent="#job_list___sub_accordion_2637" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2637_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=174" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (174, 15), end pos: (174, 54)</button></a></pre><pre>operator: core/AddNot, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -171,7 +171,7 @@ try: result = doc.write() except ValueError as e: - if "cannot save with zero pages" in str(e): + if not "cannot save with zero pages" in str(e): # Create a new document with proper structure new_doc = fitz.open() new_doc.new_page()</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.20s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2638"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2638_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2638_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2638_1"><button class="btn btn-outline-success"><span class="job_id">2638 : Job ID d3139e3ed76e450098b95a9da6f7ffee</span></button></div></a><div aria-labelledby="job_list___sub_heading_2638_1" data-parent="#job_list___sub_accordion_2638" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2638_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=197" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (197, 11), end pos: (197, 26)</button></a></pre><pre>operator: core/AddNot, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -194,7 +194,7 @@ position: str | None = None, ) -&gt; bool: """Check if watermarking is applicable.""" - if not HAS_PYMUPDF: + if not not HAS_PYMUPDF: return False try:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T235520279228Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T235521156882Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 11 failed, 3 passed, 22 warnings in 19.34s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2639"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2639_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2639_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2639_1"><button class="btn btn-outline-danger"><span class="job_id">2639 : Job ID 5b3f3095c5474140bf46cc911989921b</span></button></div></a><div aria-labelledby="job_list___sub_heading_2639_1" data-parent="#job_list___sub_accordion_2639" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2639_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=222" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (222, 11), end pos: (222, 26)</button></a></pre><pre>operator: core/AddNot, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -219,7 +219,7 @@ SecretNotFoundError: If no watermark is found InvalidKeyError: If key is incorrect """ - if not HAS_PYMUPDF: + if not not HAS_PYMUPDF: raise WatermarkingError("PyMuPDF is required for robust XMP watermarking") data = load_pdf_bytes(pdf)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.06s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2640"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2640_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2640_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2640_1"><button class="btn btn-outline-danger"><span class="job_id">2640 : Job ID 61ceace3b6564efb865854dab7d5ebaa</span></button></div></a><div aria-labelledby="job_list___sub_heading_2640_1" data-parent="#job_list___sub_accordion_2640" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2640_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=226" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (226, 11), end pos: (226, 26)</button></a></pre><pre>operator: core/AddNot, occurrence: 8</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -223,7 +223,7 @@ raise WatermarkingError("PyMuPDF is required for robust XMP watermarking") data = load_pdf_bytes(pdf) - if not key.strip(): + if not not key.strip(): raise ValueError("Key must be a non-empty string") doc = fitz.open(stream=data, filetype="pdf")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.58s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2641"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2641_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2641_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2641_1"><button class="btn btn-outline-danger"><span class="job_id">2641 : Job ID f349bfe01e33462a8b5a13e232907e12</span></button></div></a><div aria-labelledby="job_list___sub_heading_2641_1" data-parent="#job_list___sub_accordion_2641" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2641_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=235" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (235, 15), end pos: (235, 36)</button></a></pre><pre>operator: core/AddNot, occurrence: 9</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -232,7 +232,7 @@ # Try to read from document info first (more reliable for full payload) encrypted_payload = self._extract_from_document_info(doc) - if not encrypted_payload: + if not not encrypted_payload: # Fallback to XMP metadata encrypted_payload = self._extract_from_xmp(doc) </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.66s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2642"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2642_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2642_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2642_1"><button class="btn btn-outline-danger"><span class="job_id">2642 : Job ID 287466bc1c074630a3948be8411bd880</span></button></div></a><div aria-labelledby="job_list___sub_heading_2642_1" data-parent="#job_list___sub_accordion_2642" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2642_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=239" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (239, 15), end pos: (239, 36)</button></a></pre><pre>operator: core/AddNot, occurrence: 10</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -236,7 +236,7 @@ # Fallback to XMP metadata encrypted_payload = self._extract_from_xmp(doc) - if not encrypted_payload: + if not not encrypted_payload: # Last resort: try to reconstruct from fragments encrypted_payload = self._reconstruct_from_fragments(doc) </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.12s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2643"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2643_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2643_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2643_1"><button class="btn btn-outline-danger"><span class="job_id">2643 : Job ID 83bf912f705d45b3b833a83bfb614827</span></button></div></a><div aria-labelledby="job_list___sub_heading_2643_1" data-parent="#job_list___sub_accordion_2643" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2643_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=243" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (243, 15), end pos: (243, 36)</button></a></pre><pre>operator: core/AddNot, occurrence: 11</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -240,7 +240,7 @@ # Last resort: try to reconstruct from fragments encrypted_payload = self._reconstruct_from_fragments(doc) - if not encrypted_payload: + if not not encrypted_payload: raise SecretNotFoundError("No robust XMP watermark found in PDF") # Decrypt and extract secret</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.32s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2644"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2644_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2644_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2644_1"><button class="btn btn-outline-danger"><span class="job_id">2644 : Job ID 999a0101c13b495d92c01110dd87ca0e</span></button></div></a><div aria-labelledby="job_list___sub_heading_2644_1" data-parent="#job_list___sub_accordion_2644" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2644_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=337" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (337, 19), end pos: (337, 37)</button></a></pre><pre>operator: core/AddNot, occurrence: 12</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -334,7 +334,7 @@ # Add fragments to PDF as annotations or form fields for _i, fragment in enumerate(fragments): try: - if doc.page_count &gt; 0: + if not doc.page_count &gt; 0: page = doc.load_page(0) # Use first page # Create invisible annotation with fragment data</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.63s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2645"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2645_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2645_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2645_1"><button class="btn btn-outline-success"><span class="job_id">2645 : Job ID 8291146aaa614b0ab2aade6f54c102cc</span></button></div></a><div aria-labelledby="job_list___sub_heading_2645_1" data-parent="#job_list___sub_accordion_2645" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2645_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=361" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (361, 15), end pos: (361, 71)</button></a></pre><pre>operator: core/AddNot, occurrence: 13</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -358,7 +358,7 @@ producer = metadata.get("producer", "") # Check if this looks like our watermark format - if "watermark" in keywords and "Tatou Security" in producer: + if not "watermark" in keywords and "Tatou Security" in producer: # Try subject first (partial payload with watermark ID) if "tw-" in subject: parts = subject.split("-", 2) # tw-&lt;id&gt;-&lt;payload&gt;</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T210205307708Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T210206354310Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 21.62s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2646"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2646_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2646_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2646_1"><button class="btn btn-outline-danger"><span class="job_id">2646 : Job ID 302051e6d09845ec96cd1150b5b48ce9</span></button></div></a><div aria-labelledby="job_list___sub_heading_2646_1" data-parent="#job_list___sub_accordion_2646" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2646_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=363" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (363, 19), end pos: (363, 35)</button></a></pre><pre>operator: core/AddNot, occurrence: 14</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -360,7 +360,7 @@ # Check if this looks like our watermark format if "watermark" in keywords and "Tatou Security" in producer: # Try subject first (partial payload with watermark ID) - if "tw-" in subject: + if not "tw-" in subject: parts = subject.split("-", 2) # tw-&lt;id&gt;-&lt;payload&gt; if len(parts) &gt;= 3: return parts[2] # The encrypted payload part</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.11s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2647"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2647_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2647_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2647_1"><button class="btn btn-outline-danger"><span class="job_id">2647 : Job ID 3e5289febd6548f0910280a6756288f9</span></button></div></a><div aria-labelledby="job_list___sub_heading_2647_1" data-parent="#job_list___sub_accordion_2647" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2647_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=365" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (365, 23), end pos: (365, 38)</button></a></pre><pre>operator: core/AddNot, occurrence: 15</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -362,7 +362,7 @@ # Try subject first (partial payload with watermark ID) if "tw-" in subject: parts = subject.split("-", 2) # tw-&lt;id&gt;-&lt;payload&gt; - if len(parts) &gt;= 3: + if not len(parts) &gt;= 3: return parts[2] # The encrypted payload part # Fallback to title (full payload)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.41s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2648"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2648_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2648_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2648_1"><button class="btn btn-outline-danger"><span class="job_id">2648 : Job ID b21734278069464594a8665ab6ba4c86</span></button></div></a><div aria-labelledby="job_list___sub_heading_2648_1" data-parent="#job_list___sub_accordion_2648" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2648_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=369" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (369, 19), end pos: (369, 24)</button></a></pre><pre>operator: core/AddNot, occurrence: 16</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -366,7 +366,7 @@ return parts[2] # The encrypted payload part # Fallback to title (full payload) - if title: + if not title: return title except Exception: # nosec B110 # noqa: S110 pass</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.74s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2649"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2649_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2649_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2649_1"><button class="btn btn-outline-success"><span class="job_id">2649 : Job ID 6ba59a5dbaed4b238d0e4db77fb35012</span></button></div></a><div aria-labelledby="job_list___sub_heading_2649_1" data-parent="#job_list___sub_accordion_2649" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2649_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=383" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (383, 15), end pos: (383, 53)</button></a></pre><pre>operator: core/AddNot, occurrence: 17</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -380,7 +380,7 @@ title = metadata.get("title", "") # Check if this looks like our watermark format - if creator.startswith("Tatou-") and title: + if not creator.startswith("Tatou-") and title: # The full payload is stored in title return title except Exception: # nosec B110 # noqa: S110</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ef4ead2b97230dedf: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.84s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2650"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2650_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2650_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2650_1"><button class="btn btn-outline-danger"><span class="job_id">2650 : Job ID 4e4a31c7ec82498db680a5ebb28f904f</span></button></div></a><div aria-labelledby="job_list___sub_heading_2650_1" data-parent="#job_list___sub_accordion_2650" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2650_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=405" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (405, 27), end pos: (405, 63)</button></a></pre><pre>operator: core/AddNot, occurrence: 18</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -402,7 +402,7 @@ content = annot.info.get("content", "") author = annot.info.get("title", "") # Sometimes title is used - if author.startswith("tw-") and content: + if not author.startswith("tw-") and content: # Extract fragment index parts = author.split("-") if len(parts) &gt;= 2:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.26s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2651"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2651_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2651_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2651_1"><button class="btn btn-outline-danger"><span class="job_id">2651 : Job ID 686dde69c79340a696640227a8a74816</span></button></div></a><div aria-labelledby="job_list___sub_heading_2651_1" data-parent="#job_list___sub_accordion_2651" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2651_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=408" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (408, 31), end pos: (408, 46)</button></a></pre><pre>operator: core/AddNot, occurrence: 19</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -405,7 +405,7 @@ if author.startswith("tw-") and content: # Extract fragment index parts = author.split("-") - if len(parts) &gt;= 2: + if not len(parts) &gt;= 2: try: fragment_idx = int(parts[1]) fragments[fragment_idx] = base64.b64decode(content)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.02s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2652"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2652_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2652_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2652_1"><button class="btn btn-outline-danger"><span class="job_id">2652 : Job ID 78cba7b017f945c9a080190047504ece</span></button></div></a><div aria-labelledby="job_list___sub_heading_2652_1" data-parent="#job_list___sub_accordion_2652" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2652_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=418" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (418, 15), end pos: (418, 52)</button></a></pre><pre>operator: core/AddNot, occurrence: 20</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -415,7 +415,7 @@ continue # Reconstruct payload from fragments - if len(fragments) &gt;= self._MIN_FRAGMENTS: + if not len(fragments) &gt;= self._MIN_FRAGMENTS: reconstructed = b"" for i in sorted(fragments.keys()): reconstructed += fragments[i]</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.45s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2653"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2653_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2653_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2653_1"><button class="btn btn-outline-success"><span class="job_id">2653 : Job ID e85ca7ce698149878f0347d3d4356714</span></button></div></a><div aria-labelledby="job_list___sub_heading_2653_1" data-parent="#job_list___sub_accordion_2653" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2653_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=434" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (434, 15), end pos: (434, 58)</button></a></pre><pre>operator: core/AddNot, occurrence: 21</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -431,7 +431,7 @@ # Try to extract salt from the encrypted payload encrypted_data = base64.b64decode(encrypted_payload) - if len(encrypted_data) &gt;= self._SALT_SIZE + 12: + if not len(encrypted_data) &gt;= self._SALT_SIZE + 12: # Extract salt from beginning of encrypted data salt = encrypted_data[: self._SALT_SIZE] nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE + 12]</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T150107193678Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T150108051507Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.30s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2654"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2654_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2654_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2654_1"><button class="btn btn-outline-success"><span class="job_id">2654 : Job ID f368594a718a4083a49f593f00b330f1</span></button></div></a><div aria-labelledby="job_list___sub_heading_2654_1" data-parent="#job_list___sub_accordion_2654" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2654_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=449" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (449, 19), end pos: (452, 17)</button></a></pre><pre>operator: core/AddNot, occurrence: 22</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -446,7 +446,7 @@ payload = json.loads(payload_json.decode("utf-8")) # Validate payload structure - if ( + if not ( isinstance(payload, dict) and payload.get("version") == self._VERSION ):</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T153142599886Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T153143447816Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.18s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2655"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2655_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2655_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2655_1"><button class="btn btn-outline-success"><span class="job_id">2655 : Job ID 532999bed496451ca7195b51ebd523fd</span></button></div></a><div aria-labelledby="job_list___sub_heading_2655_1" data-parent="#job_list___sub_accordion_2655" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2655_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=53" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (53, 18), end pos: (53, 22)</button></a></pre><pre>operator: core/ReplaceTrueWithFalse, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -50,7 +50,7 @@ try: import fitz # PyMuPDF - HAS_PYMUPDF = True + HAS_PYMUPDF = False except ImportError: HAS_PYMUPDF = False </pre></div><div class="alert alert-secondary"><pre class="diff">.........F...F [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 47 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 2 failed, 12 passed, 22 warnings in 19.95s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2656"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2656_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2656_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2656_1"><button class="btn btn-outline-success"><span class="job_id">2656 : Job ID c8608c010db6478e9389b62e511b9f2e</span></button></div></a><div aria-labelledby="job_list___sub_heading_2656_1" data-parent="#job_list___sub_accordion_2656" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2656_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=204" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (204, 19), end pos: (204, 23)</button></a></pre><pre>operator: core/ReplaceTrueWithFalse, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -201,7 +201,7 @@ data = load_pdf_bytes(pdf) doc = fitz.open(stream=data, filetype="pdf") doc.close() - return True + return False except Exception: return False </pre></div><div class="alert alert-secondary"><pre class="diff">.........F...F [100%] ================================== FAILURES =================================== _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 400 == 201 E + where 400 = &lt;WrapperTestResponse 47 bytes [400 BAD REQUEST]&gt;.status_code ..\test\test_api.py:322: AssertionError _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_watermark_route - assert 400 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 2 failed, 12 passed, 22 warnings in 20.63s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2657"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2657_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2657_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2657_1"><button class="btn btn-outline-success"><span class="job_id">2657 : Job ID 3d8ea26bf01349fb9f5c21b35d56cfed</span></button></div></a><div aria-labelledby="job_list___sub_heading_2657_1" data-parent="#job_list___sub_accordion_2657" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2657_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=55" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (55, 18), end pos: (55, 23)</button></a></pre><pre>operator: core/ReplaceFalseWithTrue, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -52,7 +52,7 @@ HAS_PYMUPDF = True except ImportError: - HAS_PYMUPDF = False + HAS_PYMUPDF = True class RobustXmpWatermark(WatermarkingMethod):</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T045745929789Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T045746829703Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.91s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2658"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2658_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2658_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2658_1"><button class="btn btn-outline-danger"><span class="job_id">2658 : Job ID 955d6545448f4e6f85b4d3d84ea32b0c</span></button></div></a><div aria-labelledby="job_list___sub_heading_2658_1" data-parent="#job_list___sub_accordion_2658" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2658_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=198" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (198, 19), end pos: (198, 24)</button></a></pre><pre>operator: core/ReplaceFalseWithTrue, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -195,7 +195,7 @@ ) -&gt; bool: """Check if watermarking is applicable.""" if not HAS_PYMUPDF: - return False + return True try: data = load_pdf_bytes(pdf)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.55s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2659"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2659_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2659_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2659_1"><button class="btn btn-outline-danger"><span class="job_id">2659 : Job ID bae4ff2689b3489db04cf5bf95ad2578</span></button></div></a><div aria-labelledby="job_list___sub_heading_2659_1" data-parent="#job_list___sub_accordion_2659" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2659_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=206" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (206, 19), end pos: (206, 24)</button></a></pre><pre>operator: core/ReplaceFalseWithTrue, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -203,7 +203,7 @@ doc.close() return True except Exception: - return False + return True def read_secret(self, pdf: PdfSource, key: str) -&gt; str: """Extract and decrypt the watermark secret.</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.68s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2660"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2660_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2660_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2660_1"><button class="btn btn-outline-danger"><span class="job_id">2660 : Job ID 7c2f166d9de544aeb0edd6c9cb844cbc</span></button></div></a><div aria-labelledby="job_list___sub_heading_2660_1" data-parent="#job_list___sub_accordion_2660" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2660_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=361" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (361, 39), end pos: (361, 42)</button></a></pre><pre>operator: core/ReplaceAndWithOr, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -358,7 +358,7 @@ producer = metadata.get("producer", "") # Check if this looks like our watermark format - if "watermark" in keywords and "Tatou Security" in producer: + if "watermark" in keywords or "Tatou Security" in producer: # Try subject first (partial payload with watermark ID) if "tw-" in subject: parts = subject.split("-", 2) # tw-&lt;id&gt;-&lt;payload&gt;</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.07s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2661"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2661_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2661_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2661_1"><button class="btn btn-outline-danger"><span class="job_id">2661 : Job ID 70dbd9894fb74043ab9073a197eada9b</span></button></div></a><div aria-labelledby="job_list___sub_heading_2661_1" data-parent="#job_list___sub_accordion_2661" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2661_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=383" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (383, 44), end pos: (383, 47)</button></a></pre><pre>operator: core/ReplaceAndWithOr, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -380,7 +380,7 @@ title = metadata.get("title", "") # Check if this looks like our watermark format - if creator.startswith("Tatou-") and title: + if creator.startswith("Tatou-") or title: # The full payload is stored in title return title except Exception: # nosec B110 # noqa: S110</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.55s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2662"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2662_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2662_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2662_1"><button class="btn btn-outline-danger"><span class="job_id">2662 : Job ID e16e85785fa54401aa4794dbec1f6c76</span></button></div></a><div aria-labelledby="job_list___sub_heading_2662_1" data-parent="#job_list___sub_accordion_2662" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2662_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=405" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (405, 52), end pos: (405, 55)</button></a></pre><pre>operator: core/ReplaceAndWithOr, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -402,7 +402,7 @@ content = annot.info.get("content", "") author = annot.info.get("title", "") # Sometimes title is used - if author.startswith("tw-") and content: + if author.startswith("tw-") or content: # Extract fragment index parts = author.split("-") if len(parts) &gt;= 2:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.37s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2663"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2663_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2663_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2663_1"><button class="btn btn-outline-danger"><span class="job_id">2663 : Job ID 524042f9b89a4144bb4170056c7e4084</span></button></div></a><div aria-labelledby="job_list___sub_heading_2663_1" data-parent="#job_list___sub_accordion_2663" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2663_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=451" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (451, 20), end pos: (451, 23)</button></a></pre><pre>operator: core/ReplaceAndWithOr, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -448,7 +448,7 @@ # Validate payload structure if ( isinstance(payload, dict) - and payload.get("version") == self._VERSION + or payload.get("version") == self._VERSION ): return payload["secret"] </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.10s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2664"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2664_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2664_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2664_1"><button class="btn btn-outline-danger"><span class="job_id">2664 : Job ID eaafae1ae69d4f57998f0b1ef9e143e2</span></button></div></a><div aria-labelledby="job_list___sub_heading_2664_1" data-parent="#job_list___sub_accordion_2664" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2664_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=348" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (348, 16), end pos: (348, 24)</button></a></pre><pre>operator: core/ReplaceContinueWithBreak, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -345,7 +345,7 @@ except Exception: # nosec B112 # noqa: S112 # If we can't add annotations, skip fragments - continue + break def _extract_from_xmp(self, doc: fitz.Document) -&gt; str | None: """Extract watermark from XMP metadata (document info implementation)."""</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.25s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2665"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2665_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2665_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2665_1"><button class="btn btn-outline-success"><span class="job_id">2665 : Job ID 98d48661cff1423996c76797c28d60d0</span></button></div></a><div aria-labelledby="job_list___sub_heading_2665_1" data-parent="#job_list___sub_accordion_2665" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2665_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=413" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (413, 36), end pos: (413, 44)</button></a></pre><pre>operator: core/ReplaceContinueWithBreak, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -410,7 +410,7 @@ fragment_idx = int(parts[1]) fragments[fragment_idx] = base64.b64decode(content) except (ValueError, TypeError): - continue + break except Exception: # nosec B112 # noqa: S112 continue </pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T172922932799Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T172923860550Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.42s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2666"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2666_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2666_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2666_1"><button class="btn btn-outline-success"><span class="job_id">2666 : Job ID 153306ebe248432e8fd1eadfbdee625e</span></button></div></a><div aria-labelledby="job_list___sub_heading_2666_1" data-parent="#job_list___sub_accordion_2666" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2666_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=415" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (415, 24), end pos: (415, 32)</button></a></pre><pre>operator: core/ReplaceContinueWithBreak, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -412,7 +412,7 @@ except (ValueError, TypeError): continue except Exception: # nosec B112 # noqa: S112 - continue + break # Reconstruct payload from fragments if len(fragments) &gt;= self._MIN_FRAGMENTS:</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T000250470405Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T000251385165Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.32s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2667"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2667_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2667_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2667_1"><button class="btn btn-outline-danger"><span class="job_id">2667 : Job ID dc8d8fdb9fb7438bbf33ab41a3777b92</span></button></div></a><div aria-labelledby="job_list___sub_heading_2667_1" data-parent="#job_list___sub_accordion_2667" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2667_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=54" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (54, 7), end pos: (54, 18)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -51,7 +51,7 @@ import fitz # PyMuPDF HAS_PYMUPDF = True -except ImportError: +except CosmicRayTestingException: HAS_PYMUPDF = False </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.82s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2668"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2668_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2668_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2668_1"><button class="btn btn-outline-danger"><span class="job_id">2668 : Job ID 7202de0ab74d43bb807f09f791babdd6</span></button></div></a><div aria-labelledby="job_list___sub_heading_2668_1" data-parent="#job_list___sub_accordion_2668" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2668_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=152" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (152, 23), end pos: (152, 35)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -149,7 +149,7 @@ try: # Try to add a blank page if PDF structure allows it doc.new_page() - except RuntimeError: + except CosmicRayTestingException: # PDF structure is too minimal, use metadata-only approach position = "metadata-only" </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.15s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2669"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2669_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2669_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2669_1"><button class="btn btn-outline-danger"><span class="job_id">2669 : Job ID 681aa4cc35694ab7bf550762f132265f</span></button></div></a><div aria-labelledby="job_list___sub_heading_2669_1" data-parent="#job_list___sub_accordion_2669" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2669_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=156" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (156, 15), end pos: (156, 24)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -153,7 +153,7 @@ # PDF structure is too minimal, use metadata-only approach position = "metadata-only" - except Exception: + except CosmicRayTestingException: # If there are any issues, fall back to metadata-only position = "metadata-only" </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.56s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2670"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2670_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2670_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2670_1"><button class="btn btn-outline-danger"><span class="job_id">2670 : Job ID 60cc3f795fab4fedbceef5c8fa05450c</span></button></div></a><div aria-labelledby="job_list___sub_heading_2670_1" data-parent="#job_list___sub_accordion_2670" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2670_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=173" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (173, 15), end pos: (173, 25)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -170,7 +170,7 @@ # Return the watermarked PDF try: result = doc.write() - except ValueError as e: + except CosmicRayTestingException as e: if "cannot save with zero pages" in str(e): # Create a new document with proper structure new_doc = fitz.open()</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.01s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2671"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2671_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2671_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2671_1"><button class="btn btn-outline-danger"><span class="job_id">2671 : Job ID 66325a103faf4d8e9bc5ad6b8b010e88</span></button></div></a><div aria-labelledby="job_list___sub_heading_2671_1" data-parent="#job_list___sub_accordion_2671" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2671_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=205" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (205, 15), end pos: (205, 24)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -202,7 +202,7 @@ doc = fitz.open(stream=data, filetype="pdf") doc.close() return True - except Exception: + except CosmicRayTestingException: return False def read_secret(self, pdf: PdfSource, key: str) -&gt; str:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.04s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2672"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2672_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2672_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2672_1"><button class="btn btn-outline-danger"><span class="job_id">2672 : Job ID 243052d4f1e74964ae5bd1081b9a418f</span></button></div></a><div aria-labelledby="job_list___sub_heading_2672_1" data-parent="#job_list___sub_accordion_2672" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2672_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=346" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (346, 19), end pos: (346, 28)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -343,7 +343,7 @@ # Add as form field or annotation page.add_text_annot([0, 0], fragment_b64) - except Exception: # nosec B112 # noqa: S112 + except CosmicRayTestingException: # nosec B112 # noqa: S112 # If we can't add annotations, skip fragments continue </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.13s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2673"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2673_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2673_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2673_1"><button class="btn btn-outline-danger"><span class="job_id">2673 : Job ID 2c545f0301ee43cea71fdaeae1072d31</span></button></div></a><div aria-labelledby="job_list___sub_heading_2673_1" data-parent="#job_list___sub_accordion_2673" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2673_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=371" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (371, 15), end pos: (371, 24)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -368,7 +368,7 @@ # Fallback to title (full payload) if title: return title - except Exception: # nosec B110 # noqa: S110 + except CosmicRayTestingException: # nosec B110 # noqa: S110 pass return None </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.97s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2674"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2674_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2674_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2674_1"><button class="btn btn-outline-danger"><span class="job_id">2674 : Job ID 5089dd372d9045e08e8ad53c1ce8fdf1</span></button></div></a><div aria-labelledby="job_list___sub_heading_2674_1" data-parent="#job_list___sub_accordion_2674" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2674_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=386" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (386, 15), end pos: (386, 24)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -383,7 +383,7 @@ if creator.startswith("Tatou-") and title: # The full payload is stored in title return title - except Exception: # nosec B110 # noqa: S110 + except CosmicRayTestingException: # nosec B110 # noqa: S110 pass return None </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 22.61s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2675"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2675_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2675_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2675_1"><button class="btn btn-outline-danger"><span class="job_id">2675 : Job ID 7298a064516d46e8a7b76eca719dd7bc</span></button></div></a><div aria-labelledby="job_list___sub_heading_2675_1" data-parent="#job_list___sub_accordion_2675" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2675_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=412" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (412, 40), end pos: (412, 50)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 8</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -409,7 +409,7 @@ try: fragment_idx = int(parts[1]) fragments[fragment_idx] = base64.b64decode(content) - except (ValueError, TypeError): + except (CosmicRayTestingException, TypeError): continue except Exception: # nosec B112 # noqa: S112 continue</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.64s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2676"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2676_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2676_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2676_1"><button class="btn btn-outline-success"><span class="job_id">2676 : Job ID 2a063ae9f4cf4ec9b27d14652486c3a8</span></button></div></a><div aria-labelledby="job_list___sub_heading_2676_1" data-parent="#job_list___sub_accordion_2676" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2676_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=412" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (412, 52), end pos: (412, 61)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 9</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -409,7 +409,7 @@ try: fragment_idx = int(parts[1]) fragments[fragment_idx] = base64.b64decode(content) - except (ValueError, TypeError): + except (ValueError, CosmicRayTestingException): continue except Exception: # nosec B112 # noqa: S112 continue</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T150208213043Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T150209072715Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.27s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2677"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2677_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2677_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2677_1"><button class="btn btn-outline-success"><span class="job_id">2677 : Job ID 895eff86b6c94a3194cb6351eef16939</span></button></div></a><div aria-labelledby="job_list___sub_heading_2677_1" data-parent="#job_list___sub_accordion_2677" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2677_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=414" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (414, 27), end pos: (414, 36)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 10</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -411,7 +411,7 @@ fragments[fragment_idx] = base64.b64decode(content) except (ValueError, TypeError): continue - except Exception: # nosec B112 # noqa: S112 + except CosmicRayTestingException: # nosec B112 # noqa: S112 continue # Reconstruct payload from fragments</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T193349526373Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T193350480730Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 20.06s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2678"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2678_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2678_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2678_1"><button class="btn btn-outline-danger"><span class="job_id">2678 : Job ID 4752243ffafb438393bc714601c1cc19</span></button></div></a><div aria-labelledby="job_list___sub_heading_2678_1" data-parent="#job_list___sub_accordion_2678" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2678_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=424" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (424, 15), end pos: (424, 24)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 11</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -421,7 +421,7 @@ reconstructed += fragments[i] return reconstructed.decode("utf-8") - except Exception: # nosec B110 # noqa: S110 + except CosmicRayTestingException: # nosec B110 # noqa: S110 pass return None </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.09s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2679"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2679_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2679_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2679_1"><button class="btn btn-outline-success"><span class="job_id">2679 : Job ID c16ec4eab16d46b1bbd1da250c8cd941</span></button></div></a><div aria-labelledby="job_list___sub_heading_2679_1" data-parent="#job_list___sub_accordion_2679" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2679_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=458" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (458, 15), end pos: (458, 30)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 12</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -455,7 +455,7 @@ # If the above doesn't work, raise an error raise SecretNotFoundError("Invalid watermark format or corrupted data") - except InvalidKeyError: + except CosmicRayTestingException: raise except SecretNotFoundError: raise</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T231243051365Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T231244010512Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.34s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2680"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2680_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2680_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2680_1"><button class="btn btn-outline-danger"><span class="job_id">2680 : Job ID 260f37711cde47bba9cf76bbd2ee5934</span></button></div></a><div aria-labelledby="job_list___sub_heading_2680_1" data-parent="#job_list___sub_accordion_2680" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2680_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=460" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (460, 15), end pos: (460, 34)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 13</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -457,7 +457,7 @@ except InvalidKeyError: raise - except SecretNotFoundError: + except CosmicRayTestingException: raise except Exception as e: msg = f"Failed to decrypt watermark with provided key: {e}"</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.21s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2681"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2681_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2681_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2681_1"><button class="btn btn-outline-success"><span class="job_id">2681 : Job ID 164ed9cb1fba4769bd43f2357e8d9ed3</span></button></div></a><div aria-labelledby="job_list___sub_heading_2681_1" data-parent="#job_list___sub_accordion_2681" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2681_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=462" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (462, 15), end pos: (462, 24)</button></a></pre><pre>operator: core/ExceptionReplacer, occurrence: 14</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -459,7 +459,7 @@ raise except SecretNotFoundError: raise - except Exception as e: + except CosmicRayTestingException as e: msg = f"Failed to decrypt watermark with provided key: {e}" raise InvalidKeyError(msg) from e </pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFF.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T150514077208Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T150514943875Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 9 failed, 5 passed, 22 warnings in 19.31s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2682"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2682_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2682_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2682_1"><button class="btn btn-outline-success"><span class="job_id">2682 : Job ID 07f48701ddbc475fb073b4e252d909fa</span></button></div></a><div aria-labelledby="job_list___sub_heading_2682_1" data-parent="#job_list___sub_accordion_2682" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2682_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=80" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (80, 34), end pos: (80, 35)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -77,7 +77,7 @@ # Constants for the watermarking scheme _XMP_NAMESPACE: Final[str] = "http://tatou.security/watermark/" _XMP_PREFIX: Final[str] = "tw" - _FRAGMENT_COUNT: Final[int] = 3 # Number of fragments to distribute + _FRAGMENT_COUNT: Final[int] = 4 # Number of fragments to distribute _MIN_FRAGMENTS: Final[int] = 2 # Minimum fragments needed for reconstruction _SALT_SIZE: Final[int] = 16 # Salt size for key derivation _KEY_ITERATIONS: Final[int] = 100000 # PBKDF2 iterations</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T032236094431Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T032237020836Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.56s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2683"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2683_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2683_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2683_1"><button class="btn btn-outline-danger"><span class="job_id">2683 : Job ID ffee1577a63f4994aff42a4b4105f67a</span></button></div></a><div aria-labelledby="job_list___sub_heading_2683_1" data-parent="#job_list___sub_accordion_2683" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2683_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=80" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (80, 34), end pos: (80, 35)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -77,7 +77,7 @@ # Constants for the watermarking scheme _XMP_NAMESPACE: Final[str] = "http://tatou.security/watermark/" _XMP_PREFIX: Final[str] = "tw" - _FRAGMENT_COUNT: Final[int] = 3 # Number of fragments to distribute + _FRAGMENT_COUNT: Final[int] = 2 # Number of fragments to distribute _MIN_FRAGMENTS: Final[int] = 2 # Minimum fragments needed for reconstruction _SALT_SIZE: Final[int] = 16 # Salt size for key derivation _KEY_ITERATIONS: Final[int] = 100000 # PBKDF2 iterations</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.82s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2684"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2684_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2684_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2684_1"><button class="btn btn-outline-success"><span class="job_id">2684 : Job ID bc9ba28411744a84bc136cc8135f3bb1</span></button></div></a><div aria-labelledby="job_list___sub_heading_2684_1" data-parent="#job_list___sub_accordion_2684" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2684_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=81" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (81, 33), end pos: (81, 34)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -78,7 +78,7 @@ _XMP_NAMESPACE: Final[str] = "http://tatou.security/watermark/" _XMP_PREFIX: Final[str] = "tw" _FRAGMENT_COUNT: Final[int] = 3 # Number of fragments to distribute - _MIN_FRAGMENTS: Final[int] = 2 # Minimum fragments needed for reconstruction + _MIN_FRAGMENTS: Final[int] = 3 # Minimum fragments needed for reconstruction _SALT_SIZE: Final[int] = 16 # Salt size for key derivation _KEY_ITERATIONS: Final[int] = 100000 # PBKDF2 iterations _VERSION: Final[int] = 1 # Watermark format version</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T185156896823Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T185157863007Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 19.88s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2685"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2685_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2685_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2685_1"><button class="btn btn-outline-danger"><span class="job_id">2685 : Job ID 5d67096db7a24cc3ac64dbdc53727479</span></button></div></a><div aria-labelledby="job_list___sub_heading_2685_1" data-parent="#job_list___sub_accordion_2685" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2685_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=81" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (81, 33), end pos: (81, 34)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -78,7 +78,7 @@ _XMP_NAMESPACE: Final[str] = "http://tatou.security/watermark/" _XMP_PREFIX: Final[str] = "tw" _FRAGMENT_COUNT: Final[int] = 3 # Number of fragments to distribute - _MIN_FRAGMENTS: Final[int] = 2 # Minimum fragments needed for reconstruction + _MIN_FRAGMENTS: Final[int] = 1 # Minimum fragments needed for reconstruction _SALT_SIZE: Final[int] = 16 # Salt size for key derivation _KEY_ITERATIONS: Final[int] = 100000 # PBKDF2 iterations _VERSION: Final[int] = 1 # Watermark format version</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.75s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2686"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2686_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2686_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2686_1"><button class="btn btn-outline-danger"><span class="job_id">2686 : Job ID 5cbc33b0fee5433ab44a691bd63047b4</span></button></div></a><div aria-labelledby="job_list___sub_heading_2686_1" data-parent="#job_list___sub_accordion_2686" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2686_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=82" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (82, 29), end pos: (82, 31)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -79,7 +79,7 @@ _XMP_PREFIX: Final[str] = "tw" _FRAGMENT_COUNT: Final[int] = 3 # Number of fragments to distribute _MIN_FRAGMENTS: Final[int] = 2 # Minimum fragments needed for reconstruction - _SALT_SIZE: Final[int] = 16 # Salt size for key derivation + _SALT_SIZE: Final[int] = 17 # Salt size for key derivation _KEY_ITERATIONS: Final[int] = 100000 # PBKDF2 iterations _VERSION: Final[int] = 1 # Watermark format version </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.40s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2687"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2687_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2687_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2687_1"><button class="btn btn-outline-danger"><span class="job_id">2687 : Job ID a63dc2dbc99d4b02b2e144aae83da7b4</span></button></div></a><div aria-labelledby="job_list___sub_heading_2687_1" data-parent="#job_list___sub_accordion_2687" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2687_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=82" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (82, 29), end pos: (82, 31)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 5</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -79,7 +79,7 @@ _XMP_PREFIX: Final[str] = "tw" _FRAGMENT_COUNT: Final[int] = 3 # Number of fragments to distribute _MIN_FRAGMENTS: Final[int] = 2 # Minimum fragments needed for reconstruction - _SALT_SIZE: Final[int] = 16 # Salt size for key derivation + _SALT_SIZE: Final[int] = 15 # Salt size for key derivation _KEY_ITERATIONS: Final[int] = 100000 # PBKDF2 iterations _VERSION: Final[int] = 1 # Watermark format version </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.26s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2688"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2688_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2688_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2688_1"><button class="btn btn-outline-success"><span class="job_id">2688 : Job ID a229020892114eb1884030583ffa4824</span></button></div></a><div aria-labelledby="job_list___sub_heading_2688_1" data-parent="#job_list___sub_accordion_2688" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2688_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=83" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (83, 34), end pos: (83, 40)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 6</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -80,7 +80,7 @@ _FRAGMENT_COUNT: Final[int] = 3 # Number of fragments to distribute _MIN_FRAGMENTS: Final[int] = 2 # Minimum fragments needed for reconstruction _SALT_SIZE: Final[int] = 16 # Salt size for key derivation - _KEY_ITERATIONS: Final[int] = 100000 # PBKDF2 iterations + _KEY_ITERATIONS: Final[int] = 100001 # PBKDF2 iterations _VERSION: Final[int] = 1 # Watermark format version @staticmethod</pre></div><div class="alert alert-secondary"><pre class="diff">...F.......... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:228: in open request = self._request_from_builder_args(args, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:200: in _request_from_builder_args return builder.get_request() ^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:764: in get_request return cls(self.get_environ()) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:688: in get_environ input_stream, content_length, boundary = stream_encode_multipart( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:130: in stream_encode_multipart write_binary(encoder.send_event(Data(data=chunk, more_data=True))) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:81: in write_binary return stream.write(s) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... 1 failed, 13 passed, 22 warnings in 21.18s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2689"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2689_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2689_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2689_1"><button class="btn btn-outline-danger"><span class="job_id">2689 : Job ID 71fc5742adbe454da94d5101935af07a</span></button></div></a><div aria-labelledby="job_list___sub_heading_2689_1" data-parent="#job_list___sub_accordion_2689" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2689_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=83" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (83, 34), end pos: (83, 40)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 7</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -80,7 +80,7 @@ _FRAGMENT_COUNT: Final[int] = 3 # Number of fragments to distribute _MIN_FRAGMENTS: Final[int] = 2 # Minimum fragments needed for reconstruction _SALT_SIZE: Final[int] = 16 # Salt size for key derivation - _KEY_ITERATIONS: Final[int] = 100000 # PBKDF2 iterations + _KEY_ITERATIONS: Final[int] = 99999 # PBKDF2 iterations _VERSION: Final[int] = 1 # Watermark format version @staticmethod</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.40s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2690"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2690_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2690_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2690_1"><button class="btn btn-outline-danger"><span class="job_id">2690 : Job ID 1ce867be769048968cf97abc92a5df81</span></button></div></a><div aria-labelledby="job_list___sub_heading_2690_1" data-parent="#job_list___sub_accordion_2690" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2690_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=84" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (84, 27), end pos: (84, 28)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 8</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -81,7 +81,7 @@ _MIN_FRAGMENTS: Final[int] = 2 # Minimum fragments needed for reconstruction _SALT_SIZE: Final[int] = 16 # Salt size for key derivation _KEY_ITERATIONS: Final[int] = 100000 # PBKDF2 iterations - _VERSION: Final[int] = 1 # Watermark format version + _VERSION: Final[int] = 2 # Watermark format version @staticmethod def get_usage() -&gt; str:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 19.98s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2691"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2691_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2691_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2691_1"><button class="btn btn-outline-danger"><span class="job_id">2691 : Job ID 8f639816bd154227924a363075c96823</span></button></div></a><div aria-labelledby="job_list___sub_heading_2691_1" data-parent="#job_list___sub_accordion_2691" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2691_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=84" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (84, 27), end pos: (84, 28)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 9</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -81,7 +81,7 @@ _MIN_FRAGMENTS: Final[int] = 2 # Minimum fragments needed for reconstruction _SALT_SIZE: Final[int] = 16 # Salt size for key derivation _KEY_ITERATIONS: Final[int] = 100000 # PBKDF2 iterations - _VERSION: Final[int] = 1 # Watermark format version + _VERSION: Final[int] = 0 # Watermark format version @staticmethod def get_usage() -&gt; str:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.50s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2692"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2692_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2692_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2692_1"><button class="btn btn-outline-danger"><span class="job_id">2692 : Job ID eb8286c278154c16a8cc60342b9f1b1d</span></button></div></a><div aria-labelledby="job_list___sub_heading_2692_1" data-parent="#job_list___sub_accordion_2692" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2692_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=148" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (148, 33), end pos: (148, 34)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 10</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -145,7 +145,7 @@ try: # Ensure the PDF has at least one page for fragment embedding - if doc.page_count == 0: + if doc.page_count == 1: try: # Try to add a blank page if PDF structure allows it doc.new_page()</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.11s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2693"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2693_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2693_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2693_1"><button class="btn btn-outline-success"><span class="job_id">2693 : Job ID d770355ab5794f4b99844f40cd28c717</span></button></div></a><div aria-labelledby="job_list___sub_heading_2693_1" data-parent="#job_list___sub_accordion_2693" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2693_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=148" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (148, 33), end pos: (148, 34)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 11</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -145,7 +145,7 @@ try: # Ensure the PDF has at least one page for fragment embedding - if doc.page_count == 0: + if doc.page_count == -1: try: # Try to add a blank page if PDF structure allows it doc.new_page()</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T202708507953Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T202709524577Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 20.11s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2694"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2694_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2694_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2694_1"><button class="btn btn-outline-success"><span class="job_id">2694 : Job ID 2c44b5b0ec13426f897d5b0a801c9692</span></button></div></a><div aria-labelledby="job_list___sub_heading_2694_1" data-parent="#job_list___sub_accordion_2694" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2694_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=256" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (256, 19), end pos: (256, 21)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 12</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -253,7 +253,7 @@ """Derive encryption key from password and salt.""" kdf = PBKDF2HMAC( algorithm=hashes.SHA256(), - length=32, # 256-bit key + length= 33, # 256-bit key salt=salt, iterations=self._KEY_ITERATIONS, )</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T003921883936Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T003922766321Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614ed49cb199cfaaac72: AESGCM key must be 128, 192, or 256 bits. ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 11 failed, 3 passed, 22 warnings in 19.32s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2695"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2695_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2695_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2695_1"><button class="btn btn-outline-success"><span class="job_id">2695 : Job ID 8a4f2bb805c24ca1bd65fddb85a39d87</span></button></div></a><div aria-labelledby="job_list___sub_heading_2695_1" data-parent="#job_list___sub_accordion_2695" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2695_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=256" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (256, 19), end pos: (256, 21)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 13</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -253,7 +253,7 @@ """Derive encryption key from password and salt.""" kdf = PBKDF2HMAC( algorithm=hashes.SHA256(), - length=32, # 256-bit key + length= 31, # 256-bit key salt=salt, iterations=self._KEY_ITERATIONS, )</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.F [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T231650073734Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T231651017229Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e4f10fa456c7447ba: AESGCM key must be 128, 192, or 256 bits. ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 9 failed, 5 passed, 22 warnings in 19.47s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2696"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2696_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2696_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2696_1"><button class="btn btn-outline-success"><span class="job_id">2696 : Job ID baa97d462fa242e9af3b86a7041ce152</span></button></div></a><div aria-labelledby="job_list___sub_heading_2696_1" data-parent="#job_list___sub_accordion_2696" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2696_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=265" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (265, 36), end pos: (265, 38)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 14</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -262,7 +262,7 @@ def _encrypt_payload(self, payload: dict[str, Any], key: bytes) -&gt; str: """Encrypt payload using AES-GCM and include salt.""" aesgcm = AESGCM(key) - nonce = secrets.token_bytes(12) # 96-bit nonce for GCM + nonce = secrets.token_bytes( 13) # 96-bit nonce for GCM payload_json = json.dumps(payload, separators=(",", ":")).encode("utf-8") ciphertext = aesgcm.encrypt(nonce, payload_json, None)</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T000230391214Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T000231302207Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 19.46s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2697"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2697_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2697_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2697_1"><button class="btn btn-outline-danger"><span class="job_id">2697 : Job ID 84013b34ff424dfd8dcdef9867946d78</span></button></div></a><div aria-labelledby="job_list___sub_heading_2697_1" data-parent="#job_list___sub_accordion_2697" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2697_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=265" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (265, 36), end pos: (265, 38)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 15</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -262,7 +262,7 @@ def _encrypt_payload(self, payload: dict[str, Any], key: bytes) -&gt; str: """Encrypt payload using AES-GCM and include salt.""" aesgcm = AESGCM(key) - nonce = secrets.token_bytes(12) # 96-bit nonce for GCM + nonce = secrets.token_bytes( 11) # 96-bit nonce for GCM payload_json = json.dumps(payload, separators=(",", ":")).encode("utf-8") ciphertext = aesgcm.encrypt(nonce, payload_json, None)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.64s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2698"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2698_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2698_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2698_1"><button class="btn btn-outline-success"><span class="job_id">2698 : Job ID 46b0e02f44e747ebb2601d909bf2a34d</span></button></div></a><div aria-labelledby="job_list___sub_heading_2698_1" data-parent="#job_list___sub_accordion_2698" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2698_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=294" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (294, 47), end pos: (294, 48)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 16</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -291,7 +291,7 @@ # Use a combination of standard and custom fields metadata.update( { - "subject": f"tw-{watermark_id[:8]}-{encrypted_payload[:100]}", + "subject": f"tw-{watermark_id[: 9]}-{encrypted_payload[:100]}", "keywords": f"watermark,{watermark_id}", "producer": f"Tatou Security Watermarker v{self._VERSION}", }</pre></div><div class="alert alert-secondary"><pre class="diff">...F.......... [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:228: in open request = self._request_from_builder_args(args, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:200: in _request_from_builder_args return builder.get_request() ^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:764: in get_request return cls(self.get_environ()) ^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:688: in get_environ input_stream, content_length, boundary = stream_encode_multipart( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:130: in stream_encode_multipart write_binary(encoder.send_event(Data(data=chunk, more_data=True))) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:81: in write_binary return stream.write(s) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... 1 failed, 13 passed, 22 warnings in 21.23s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2699"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2699_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2699_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2699_1"><button class="btn btn-outline-danger"><span class="job_id">2699 : Job ID bb437fa83c384219bcaad2225fc712e9</span></button></div></a><div aria-labelledby="job_list___sub_heading_2699_1" data-parent="#job_list___sub_accordion_2699" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2699_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=294" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (294, 47), end pos: (294, 48)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 17</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -291,7 +291,7 @@ # Use a combination of standard and custom fields metadata.update( { - "subject": f"tw-{watermark_id[:8]}-{encrypted_payload[:100]}", + "subject": f"tw-{watermark_id[: 7]}-{encrypted_payload[:100]}", "keywords": f"watermark,{watermark_id}", "producer": f"Tatou Security Watermarker v{self._VERSION}", }</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.81s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2700"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2700_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2700_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2700_1"><button class="btn btn-outline-success"><span class="job_id">2700 : Job ID 7414af49092d49448195ce450ff351a4</span></button></div></a><div aria-labelledby="job_list___sub_heading_2700_1" data-parent="#job_list___sub_accordion_2700" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2700_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=294" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (294, 71), end pos: (294, 74)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 18</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -291,7 +291,7 @@ # Use a combination of standard and custom fields metadata.update( { - "subject": f"tw-{watermark_id[:8]}-{encrypted_payload[:100]}", + "subject": f"tw-{watermark_id[:8]}-{encrypted_payload[: 101]}", "keywords": f"watermark,{watermark_id}", "producer": f"Tatou Security Watermarker v{self._VERSION}", }</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....FFF.F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 32 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:357 File save error: [Errno 28] No space left on device _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e5743e064cb1b7cd3: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 5 failed, 9 passed, 22 warnings in 19.92s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2701"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2701_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2701_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2701_1"><button class="btn btn-outline-danger"><span class="job_id">2701 : Job ID d338b407bb7a4276909781cc4aca9b75</span></button></div></a><div aria-labelledby="job_list___sub_heading_2701_1" data-parent="#job_list___sub_accordion_2701" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2701_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=294" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (294, 71), end pos: (294, 74)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 19</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -291,7 +291,7 @@ # Use a combination of standard and custom fields metadata.update( { - "subject": f"tw-{watermark_id[:8]}-{encrypted_payload[:100]}", + "subject": f"tw-{watermark_id[:8]}-{encrypted_payload[: 99]}", "keywords": f"watermark,{watermark_id}", "producer": f"Tatou Security Watermarker v{self._VERSION}", }</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.55s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2702"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2702_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2702_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2702_1"><button class="btn btn-outline-danger"><span class="job_id">2702 : Job ID eb25415930aa43a8b25b3cc18a11be4d</span></button></div></a><div aria-labelledby="job_list___sub_heading_2702_1" data-parent="#job_list___sub_accordion_2702" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2702_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=309" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (309, 50), end pos: (309, 51)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 20</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -306,7 +306,7 @@ metadata = doc.metadata metadata.update( { - "creator": f"Tatou-{watermark_id[:8]}", # Partial ID in creator + "creator": f"Tatou-{watermark_id[: 9]}", # Partial ID in creator "title": encrypted_payload, # Full payload in title (main storage) } )</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.07s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2703"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2703_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2703_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2703_1"><button class="btn btn-outline-success"><span class="job_id">2703 : Job ID 149e7d6f83b446c48df886895ea3faaf</span></button></div></a><div aria-labelledby="job_list___sub_heading_2703_1" data-parent="#job_list___sub_accordion_2703" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2703_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=309" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (309, 50), end pos: (309, 51)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 21</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -306,7 +306,7 @@ metadata = doc.metadata metadata.update( { - "creator": f"Tatou-{watermark_id[:8]}", # Partial ID in creator + "creator": f"Tatou-{watermark_id[: 7]}", # Partial ID in creator "title": encrypted_payload, # Full payload in title (main storage) } )</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T152049766169Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T152050604613Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.04s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2704"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2704_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2704_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2704_1"><button class="btn btn-outline-danger"><span class="job_id">2704 : Job ID 5836885d216b46139588a9af2a3024a3</span></button></div></a><div aria-labelledby="job_list___sub_heading_2704_1" data-parent="#job_list___sub_accordion_2704" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2704_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=325" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (325, 69), end pos: (325, 70)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 22</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -322,7 +322,7 @@ """Distribute watermark fragments across PDF objects.""" # Split payload into fragments payload_bytes = encrypted_payload.encode("utf-8") - fragment_size = len(payload_bytes) // self._FRAGMENT_COUNT + 1 + fragment_size = len(payload_bytes) // self._FRAGMENT_COUNT + 2 fragments = [] for i in range(self._FRAGMENT_COUNT):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.50s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2705"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2705_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2705_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2705_1"><button class="btn btn-outline-danger"><span class="job_id">2705 : Job ID 0a083c249e81411fb4d7b408b177876b</span></button></div></a><div aria-labelledby="job_list___sub_heading_2705_1" data-parent="#job_list___sub_accordion_2705" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2705_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=325" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (325, 69), end pos: (325, 70)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 23</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -322,7 +322,7 @@ """Distribute watermark fragments across PDF objects.""" # Split payload into fragments payload_bytes = encrypted_payload.encode("utf-8") - fragment_size = len(payload_bytes) // self._FRAGMENT_COUNT + 1 + fragment_size = len(payload_bytes) // self._FRAGMENT_COUNT + 0 fragments = [] for i in range(self._FRAGMENT_COUNT):</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.28s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2706"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2706_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2706_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2706_1"><button class="btn btn-outline-danger"><span class="job_id">2706 : Job ID 0cc4af6f1cf84cb1ad3391b8bb314e56</span></button></div></a><div aria-labelledby="job_list___sub_heading_2706_1" data-parent="#job_list___sub_accordion_2706" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2706_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=337" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (337, 36), end pos: (337, 37)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 24</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -334,7 +334,7 @@ # Add fragments to PDF as annotations or form fields for _i, fragment in enumerate(fragments): try: - if doc.page_count &gt; 0: + if doc.page_count &gt; 1: page = doc.load_page(0) # Use first page # Create invisible annotation with fragment data</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.05s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2707"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2707_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2707_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2707_1"><button class="btn btn-outline-danger"><span class="job_id">2707 : Job ID 8175dc4aa97040c5823c5855f5bfcc42</span></button></div></a><div aria-labelledby="job_list___sub_heading_2707_1" data-parent="#job_list___sub_accordion_2707" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2707_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=337" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (337, 36), end pos: (337, 37)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 25</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -334,7 +334,7 @@ # Add fragments to PDF as annotations or form fields for _i, fragment in enumerate(fragments): try: - if doc.page_count &gt; 0: + if doc.page_count &gt; -1: page = doc.load_page(0) # Use first page # Create invisible annotation with fragment data</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.51s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2708"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2708_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2708_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2708_1"><button class="btn btn-outline-danger"><span class="job_id">2708 : Job ID d34b8a53706a423fbaebf77678667d93</span></button></div></a><div aria-labelledby="job_list___sub_heading_2708_1" data-parent="#job_list___sub_accordion_2708" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2708_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=338" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (338, 41), end pos: (338, 42)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 26</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -335,7 +335,7 @@ for _i, fragment in enumerate(fragments): try: if doc.page_count &gt; 0: - page = doc.load_page(0) # Use first page + page = doc.load_page( 1) # Use first page # Create invisible annotation with fragment data fragment_b64 = base64.b64encode(fragment).decode("ascii")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.28s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2709"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2709_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2709_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2709_1"><button class="btn btn-outline-danger"><span class="job_id">2709 : Job ID c3224a0b2f2d4d8e8e1c42407e5d6ce1</span></button></div></a><div aria-labelledby="job_list___sub_heading_2709_1" data-parent="#job_list___sub_accordion_2709" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2709_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=338" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (338, 41), end pos: (338, 42)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 27</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -335,7 +335,7 @@ for _i, fragment in enumerate(fragments): try: if doc.page_count &gt; 0: - page = doc.load_page(0) # Use first page + page = doc.load_page( -1) # Use first page # Create invisible annotation with fragment data fragment_b64 = base64.b64encode(fragment).decode("ascii")</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.13s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2710"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2710_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2710_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2710_1"><button class="btn btn-outline-danger"><span class="job_id">2710 : Job ID 9bb233f9d79b4c09b734faaf61591bd0</span></button></div></a><div aria-labelledby="job_list___sub_heading_2710_1" data-parent="#job_list___sub_accordion_2710" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2710_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=344" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (344, 41), end pos: (344, 42)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 28</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -341,7 +341,7 @@ fragment_b64 = base64.b64encode(fragment).decode("ascii") # Add as form field or annotation - page.add_text_annot([0, 0], fragment_b64) + page.add_text_annot([ 1, 0], fragment_b64) except Exception: # nosec B112 # noqa: S112 # If we can't add annotations, skip fragments</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.21s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2711"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2711_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2711_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2711_1"><button class="btn btn-outline-danger"><span class="job_id">2711 : Job ID ff06670eb84b4e089e15d345ffb2efaf</span></button></div></a><div aria-labelledby="job_list___sub_heading_2711_1" data-parent="#job_list___sub_accordion_2711" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2711_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=344" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (344, 41), end pos: (344, 42)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 29</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -341,7 +341,7 @@ fragment_b64 = base64.b64encode(fragment).decode("ascii") # Add as form field or annotation - page.add_text_annot([0, 0], fragment_b64) + page.add_text_annot([ -1, 0], fragment_b64) except Exception: # nosec B112 # noqa: S112 # If we can't add annotations, skip fragments</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.22s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2712"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2712_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2712_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2712_1"><button class="btn btn-outline-danger"><span class="job_id">2712 : Job ID 6a1c849b1698411a85da8aba5de9760a</span></button></div></a><div aria-labelledby="job_list___sub_heading_2712_1" data-parent="#job_list___sub_accordion_2712" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2712_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=344" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (344, 44), end pos: (344, 45)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 30</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -341,7 +341,7 @@ fragment_b64 = base64.b64encode(fragment).decode("ascii") # Add as form field or annotation - page.add_text_annot([0, 0], fragment_b64) + page.add_text_annot([0, 1], fragment_b64) except Exception: # nosec B112 # noqa: S112 # If we can't add annotations, skip fragments</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.37s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2713"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2713_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2713_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2713_1"><button class="btn btn-outline-danger"><span class="job_id">2713 : Job ID 61f091bb4c864ce3990b4a65d1589d31</span></button></div></a><div aria-labelledby="job_list___sub_heading_2713_1" data-parent="#job_list___sub_accordion_2713" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2713_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=344" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (344, 44), end pos: (344, 45)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 31</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -341,7 +341,7 @@ fragment_b64 = base64.b64encode(fragment).decode("ascii") # Add as form field or annotation - page.add_text_annot([0, 0], fragment_b64) + page.add_text_annot([0, -1], fragment_b64) except Exception: # nosec B112 # noqa: S112 # If we can't add annotations, skip fragments</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.41s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2714"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2714_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2714_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2714_1"><button class="btn btn-outline-danger"><span class="job_id">2714 : Job ID fbe98dad673b4398aa988d9fdd921c90</span></button></div></a><div aria-labelledby="job_list___sub_heading_2714_1" data-parent="#job_list___sub_accordion_2714" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2714_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=364" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (364, 47), end pos: (364, 48)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 32</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -361,7 +361,7 @@ if "watermark" in keywords and "Tatou Security" in producer: # Try subject first (partial payload with watermark ID) if "tw-" in subject: - parts = subject.split("-", 2) # tw-&lt;id&gt;-&lt;payload&gt; + parts = subject.split("-", 3) # tw-&lt;id&gt;-&lt;payload&gt; if len(parts) &gt;= 3: return parts[2] # The encrypted payload part </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 21.76s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2715"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2715_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2715_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2715_1"><button class="btn btn-outline-danger"><span class="job_id">2715 : Job ID f6ae3a8d32194953bb59c68c209b4fce</span></button></div></a><div aria-labelledby="job_list___sub_heading_2715_1" data-parent="#job_list___sub_accordion_2715" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2715_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=364" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (364, 47), end pos: (364, 48)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 33</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -361,7 +361,7 @@ if "watermark" in keywords and "Tatou Security" in producer: # Try subject first (partial payload with watermark ID) if "tw-" in subject: - parts = subject.split("-", 2) # tw-&lt;id&gt;-&lt;payload&gt; + parts = subject.split("-", 1) # tw-&lt;id&gt;-&lt;payload&gt; if len(parts) &gt;= 3: return parts[2] # The encrypted payload part </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.21s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2716"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2716_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2716_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2716_1"><button class="btn btn-outline-danger"><span class="job_id">2716 : Job ID 6c37e1537e0f4e108e20eabf59c88c1a</span></button></div></a><div aria-labelledby="job_list___sub_heading_2716_1" data-parent="#job_list___sub_accordion_2716" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2716_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=365" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (365, 37), end pos: (365, 38)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 34</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -362,7 +362,7 @@ # Try subject first (partial payload with watermark ID) if "tw-" in subject: parts = subject.split("-", 2) # tw-&lt;id&gt;-&lt;payload&gt; - if len(parts) &gt;= 3: + if len(parts) &gt;= 4: return parts[2] # The encrypted payload part # Fallback to title (full payload)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.04s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2717"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2717_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2717_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2717_1"><button class="btn btn-outline-danger"><span class="job_id">2717 : Job ID cdea30a2cd05466abdff1ecc2aec4b7a</span></button></div></a><div aria-labelledby="job_list___sub_heading_2717_1" data-parent="#job_list___sub_accordion_2717" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2717_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=365" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (365, 37), end pos: (365, 38)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 35</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -362,7 +362,7 @@ # Try subject first (partial payload with watermark ID) if "tw-" in subject: parts = subject.split("-", 2) # tw-&lt;id&gt;-&lt;payload&gt; - if len(parts) &gt;= 3: + if len(parts) &gt;= 2: return parts[2] # The encrypted payload part # Fallback to title (full payload)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.13s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2718"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2718_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2718_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2718_1"><button class="btn btn-outline-danger"><span class="job_id">2718 : Job ID bd3011b19b6648088d493853e2066633</span></button></div></a><div aria-labelledby="job_list___sub_heading_2718_1" data-parent="#job_list___sub_accordion_2718" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2718_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=366" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (366, 37), end pos: (366, 38)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 36</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -363,7 +363,7 @@ if "tw-" in subject: parts = subject.split("-", 2) # tw-&lt;id&gt;-&lt;payload&gt; if len(parts) &gt;= 3: - return parts[2] # The encrypted payload part + return parts[ 3] # The encrypted payload part # Fallback to title (full payload) if title:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.45s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2719"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2719_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2719_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2719_1"><button class="btn btn-outline-danger"><span class="job_id">2719 : Job ID 09973284c91b4cde90fdd66f507fef4d</span></button></div></a><div aria-labelledby="job_list___sub_heading_2719_1" data-parent="#job_list___sub_accordion_2719" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2719_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=366" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (366, 37), end pos: (366, 38)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 37</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -363,7 +363,7 @@ if "tw-" in subject: parts = subject.split("-", 2) # tw-&lt;id&gt;-&lt;payload&gt; if len(parts) &gt;= 3: - return parts[2] # The encrypted payload part + return parts[ 1] # The encrypted payload part # Fallback to title (full payload) if title:</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.12s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2720"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2720_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2720_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2720_1"><button class="btn btn-outline-danger"><span class="job_id">2720 : Job ID c5510af9177a40e7a9f369a3a407160b</span></button></div></a><div aria-labelledby="job_list___sub_heading_2720_1" data-parent="#job_list___sub_accordion_2720" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2720_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=396" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (396, 54), end pos: (396, 55)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 38</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -393,7 +393,7 @@ fragments = {} # Look for annotations with our fragment pattern - for page_num in range(min(doc.page_count, 5)): # Check first few pages only + for page_num in range(min(doc.page_count, 6)): # Check first few pages only page = doc.load_page(page_num) annots = page.annots() </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.67s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2721"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2721_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2721_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2721_1"><button class="btn btn-outline-danger"><span class="job_id">2721 : Job ID b9e5dd0f179c4dd4a4610bb9f8ec7900</span></button></div></a><div aria-labelledby="job_list___sub_heading_2721_1" data-parent="#job_list___sub_accordion_2721" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2721_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=396" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (396, 54), end pos: (396, 55)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 39</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -393,7 +393,7 @@ fragments = {} # Look for annotations with our fragment pattern - for page_num in range(min(doc.page_count, 5)): # Check first few pages only + for page_num in range(min(doc.page_count, 4)): # Check first few pages only page = doc.load_page(page_num) annots = page.annots() </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.40s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2722"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2722_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2722_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2722_1"><button class="btn btn-outline-danger"><span class="job_id">2722 : Job ID 86c3668c5f2349bda155516a0e8b90d1</span></button></div></a><div aria-labelledby="job_list___sub_heading_2722_1" data-parent="#job_list___sub_accordion_2722" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2722_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=408" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (408, 45), end pos: (408, 46)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 40</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -405,7 +405,7 @@ if author.startswith("tw-") and content: # Extract fragment index parts = author.split("-") - if len(parts) &gt;= 2: + if len(parts) &gt;= 3: try: fragment_idx = int(parts[1]) fragments[fragment_idx] = base64.b64decode(content)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.18s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2723"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2723_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2723_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2723_1"><button class="btn btn-outline-danger"><span class="job_id">2723 : Job ID 551b11e7b1da4c50ad950b74290fc4df</span></button></div></a><div aria-labelledby="job_list___sub_heading_2723_1" data-parent="#job_list___sub_accordion_2723" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2723_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=408" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (408, 45), end pos: (408, 46)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 41</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -405,7 +405,7 @@ if author.startswith("tw-") and content: # Extract fragment index parts = author.split("-") - if len(parts) &gt;= 2: + if len(parts) &gt;= 1: try: fragment_idx = int(parts[1]) fragments[fragment_idx] = base64.b64decode(content)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.11s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2724"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2724_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2724_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2724_1"><button class="btn btn-outline-danger"><span class="job_id">2724 : Job ID 769b56f0b3f646559903f28e468279a0</span></button></div></a><div aria-labelledby="job_list___sub_heading_2724_1" data-parent="#job_list___sub_accordion_2724" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2724_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=410" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (410, 61), end pos: (410, 62)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 42</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -407,7 +407,7 @@ parts = author.split("-") if len(parts) &gt;= 2: try: - fragment_idx = int(parts[1]) + fragment_idx = int(parts[ 2]) fragments[fragment_idx] = base64.b64decode(content) except (ValueError, TypeError): continue</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.13s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2725"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2725_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2725_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2725_1"><button class="btn btn-outline-success"><span class="job_id">2725 : Job ID af11e9865b9348f086998a3882e9826b</span></button></div></a><div aria-labelledby="job_list___sub_heading_2725_1" data-parent="#job_list___sub_accordion_2725" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2725_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=410" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (410, 61), end pos: (410, 62)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 43</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -407,7 +407,7 @@ parts = author.split("-") if len(parts) &gt;= 2: try: - fragment_idx = int(parts[1]) + fragment_idx = int(parts[ 0]) fragments[fragment_idx] = base64.b64decode(content) except (ValueError, TypeError): continue</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T042650566898Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T042651524344Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse streamed [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:844 DB delete error for doc id=2: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 503 == 200 10 failed, 4 passed, 22 warnings in 20.19s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2726"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2726_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2726_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2726_1"><button class="btn btn-outline-danger"><span class="job_id">2726 : Job ID 8176104fbda142528731885ffe12d713</span></button></div></a><div aria-labelledby="job_list___sub_heading_2726_1" data-parent="#job_list___sub_accordion_2726" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2726_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=434" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (434, 56), end pos: (434, 58)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 44</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -431,7 +431,7 @@ # Try to extract salt from the encrypted payload encrypted_data = base64.b64decode(encrypted_payload) - if len(encrypted_data) &gt;= self._SALT_SIZE + 12: + if len(encrypted_data) &gt;= self._SALT_SIZE + 13: # Extract salt from beginning of encrypted data salt = encrypted_data[: self._SALT_SIZE] nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE + 12]</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.67s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2727"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2727_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2727_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2727_1"><button class="btn btn-outline-success"><span class="job_id">2727 : Job ID fcd583bdd193476a99e281aaeff09c70</span></button></div></a><div aria-labelledby="job_list___sub_heading_2727_1" data-parent="#job_list___sub_accordion_2727" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2727_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=434" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (434, 56), end pos: (434, 58)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 45</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -431,7 +431,7 @@ # Try to extract salt from the encrypted payload encrypted_data = base64.b64decode(encrypted_payload) - if len(encrypted_data) &gt;= self._SALT_SIZE + 12: + if len(encrypted_data) &gt;= self._SALT_SIZE + 11: # Extract salt from beginning of encrypted data salt = encrypted_data[: self._SALT_SIZE] nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE + 12]</pre></div><div class="alert alert-secondary"><pre class="diff">.FFFFFFF.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 30 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:280 Database error in login: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T004453166658Z__input.pdf user=1 __________________________ test_list_documents_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_documents_route(client): """Test document list endpoint.""" resp = client.get("/api/list-documents") resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 55 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:198: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:432 Database error in list_documents for user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:504 Database error in list_versions: 1,1 ________________________ test_list_all_versions_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_all_versions_route(client): """Test list all versions endpoint.""" #call without parameters resp = client.get("/api/list-all-versions") #Fix list all versions on API.md! resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 503 == 200 E + where 503 = &lt;WrapperTestResponse 54 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:255: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:551 Database error in list_all_versions for user=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:600 Database error in get_document: 1,1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:968 Database error fetching document (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251017T004454030773Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 503 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_documents_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_list_all_versions_route - assert 503 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 10 failed, 4 passed, 22 warnings in 19.24s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2728"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2728_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2728_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2728_1"><button class="btn btn-outline-danger"><span class="job_id">2728 : Job ID cca42c4f720744afa02e7d38707c1ec2</span></button></div></a><div aria-labelledby="job_list___sub_heading_2728_1" data-parent="#job_list___sub_accordion_2728" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2728_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=437" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (437, 75), end pos: (437, 77)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 46</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -434,7 +434,7 @@ if len(encrypted_data) &gt;= self._SALT_SIZE + 12: # Extract salt from beginning of encrypted data salt = encrypted_data[: self._SALT_SIZE] - nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE + 12] + nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE + 13] ciphertext = encrypted_data[self._SALT_SIZE + 12 :] # Derive key using extracted salt</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 22.71s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2729"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2729_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2729_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2729_1"><button class="btn btn-outline-success"><span class="job_id">2729 : Job ID e23d8471e6484d65850ff2409053dcb0</span></button></div></a><div aria-labelledby="job_list___sub_heading_2729_1" data-parent="#job_list___sub_accordion_2729" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2729_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=437" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (437, 75), end pos: (437, 77)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 47</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -434,7 +434,7 @@ if len(encrypted_data) &gt;= self._SALT_SIZE + 12: # Extract salt from beginning of encrypted data salt = encrypted_data[: self._SALT_SIZE] - nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE + 12] + nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE + 11] ciphertext = encrypted_data[self._SALT_SIZE + 12 :] # Derive key using extracted salt</pre></div><div class="alert alert-secondary"><pre class="diff">.FFF.F.F.FFF.. [100%] ================================== FAILURES =================================== ___________________________ test_create_user_route ____________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_user_route(client): """Test user creation endpoint.""" parameters = { "login": "username", "password": "password", "email": "user@email.se", } # pragma: allowlist secret resp = client.post("/api/create-user", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 201 # Endpoint should exist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 27 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:73: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:236 Database error in create_user: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') (Background on this error at: https://sqlalche.me/e/20/e3q8) ______________________________ test_login_route _______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_login_route(client): """Test login endpoint.""" parameters = { "email": "user@email.se", "password": "password", } # pragma: allowlist secret resp = client.post("/api/login", json=parameters) resp_data = resp.get_json() # Note: This will likely fail due to database connectivity in tests # but we can test that the endpoint exists and handles the request #basic tests &gt; assert resp.status_code == 200 E assert 401 == 200 E + where 401 = &lt;WrapperTestResponse 32 bytes [401 UNAUTHORIZED]&gt;.status_code ..\test\test_api.py:117: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:272 Failed login attempt for email: user@email.se _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests &gt; assert resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:152: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T211755673802Z__input.pdf user=1 __________________________ test_list_versions_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_list_versions_route(client): """Test list versions endpoint.""" parameters = {"documentid":1} resp = client.get("/api/list-versions", query_string = parameters) #resp = client.get("/api/list-versions/1") #for test without parameters resp_data = resp.get_json() #basic tests &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:220: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:486 Document not found or access denied for id=1 ___________________________ test_get_document_route ___________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_document_route(client): """Test get document endpoint.""" parameters = {"documentid":1} resp = client.get("/api/get-document", query_string=parameters) #resp = client.get("/api/get-document/1") #for test without parameters # Check Content-Type is_pdf = resp.headers.get('Content-Type') == 'application/pdf' # Check Content-Disposition for 'inline' content_disposition = resp.headers.get('Content-Disposition', '') is_inline = 'inline' in content_disposition.lower() #Oracle &gt; assert is_pdf E assert False ..\test\test_api.py:282: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:610 Document not found or access denied for id=1 _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 404 == 201 E + where 404 = &lt;WrapperTestResponse 31 bytes [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:972 Document not found or access denied for watermarking id=1 __________________________ test_read_watermark_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_read_watermark_route(client): """Test read watermark endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #Upload watermarked file to the app with open(file_path, "rb") as f: data = { "file": (f, "watermarked.pdf"), "name": "Water File" } upload_resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') upload_resp_data = upload_resp.get_json() &gt; assert upload_resp.status_code == 201 E assert 503 == 201 E + where 503 = &lt;WrapperTestResponse 36 bytes [503 SERVICE UNAVAILABLE]&gt;.status_code ..\test\test_api.py:389: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:393 Database error inserting document path=C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\20251016T211756691717Z__watermarked.pdf user=1 _________________________ test_delete_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_delete_document_route(client): document_id = {"id": 2} resp = client.delete("/api/delete-document", json=document_id) #resp = client.delete("/api/delete-document/2") &gt; assert resp.status_code == 200 E assert 404 == 200 E + where 404 = &lt;WrapperTestResponse streamed [404 NOT FOUND]&gt;.status_code ..\test\test_api.py:443: AssertionError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:850 Document not found or access denied for deletion id=2 ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_create_user_route - assert 503 == 201 FAILED ..\test\test_api.py::test_login_route - assert 401 == 200 FAILED ..\test\test_api.py::test_upload_document_route - assert 503 == 201 FAILED ..\test\test_api.py::test_list_versions_route - assert 404 == 200 FAILED ..\test\test_api.py::test_get_document_route - assert False FAILED ..\test\test_api.py::test_create_watermark_route - assert 404 == 201 FAILED ..\test\test_api.py::test_read_watermark_route - assert 503 == 201 FAILED ..\test\test_api.py::test_delete_document_route - assert 404 == 200 8 failed, 6 passed, 22 warnings in 20.22s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2730"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2730_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2730_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2730_1"><button class="btn btn-outline-danger"><span class="job_id">2730 : Job ID af0b9839a31c48359c07379271b629fb</span></button></div></a><div aria-labelledby="job_list___sub_heading_2730_1" data-parent="#job_list___sub_accordion_2730" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2730_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=438" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (438, 62), end pos: (438, 64)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 48</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -435,7 +435,7 @@ # Extract salt from beginning of encrypted data salt = encrypted_data[: self._SALT_SIZE] nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE + 12] - ciphertext = encrypted_data[self._SALT_SIZE + 12 :] + ciphertext = encrypted_data[self._SALT_SIZE + 13 :] # Derive key using extracted salt derived_key = self._derive_key(key, salt)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.40s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2731"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2731_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2731_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2731_1"><button class="btn btn-outline-danger"><span class="job_id">2731 : Job ID 722bffe6a1bd43959e36ec2798c9c132</span></button></div></a><div aria-labelledby="job_list___sub_heading_2731_1" data-parent="#job_list___sub_accordion_2731" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2731_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=438" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (438, 62), end pos: (438, 64)</button></a></pre><pre>operator: core/NumberReplacer, occurrence: 49</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -435,7 +435,7 @@ # Extract salt from beginning of encrypted data salt = encrypted_data[: self._SALT_SIZE] nonce = encrypted_data[self._SALT_SIZE : self._SALT_SIZE + 12] - ciphertext = encrypted_data[self._SALT_SIZE + 12 :] + ciphertext = encrypted_data[self._SALT_SIZE + 11 :] # Derive key using extracted salt derived_key = self._derive_key(key, salt)</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.03s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2732"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2732_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2732_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2732_1"><button class="btn btn-outline-success"><span class="job_id">2732 : Job ID 46517a8d9a614f13b88b3ef7163c06e0</span></button></div></a><div aria-labelledby="job_list___sub_heading_2732_1" data-parent="#job_list___sub_accordion_2732" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2732_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=86" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (86, 4), end pos: (87, 0)</button></a></pre><pre>operator: core/RemoveDecorator, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -82,8 +82,6 @@ _SALT_SIZE: Final[int] = 16 # Salt size for key derivation _KEY_ITERATIONS: Final[int] = 100000 # PBKDF2 iterations _VERSION: Final[int] = 1 # Watermark format version - - @staticmethod def get_usage() -&gt; str: return ( "Robust watermarking method using XMP metadata and distributed fragments. "</pre></div><div class="alert alert-secondary"><pre class="diff">........F..... [100%] ================================== FAILURES =================================== _____________________ test_get_watermarking_methods_route _____________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_get_watermarking_methods_route(client): """Test get watermarking methods endpoint.""" &gt; resp = client.get("/api/get-watermarking-methods") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:297: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1162: in get return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @app.get("/api/get-watermarking-methods") def get_watermarking_methods(): methods = [] for m in WMUtils.METHODS: methods.append( &gt; {"name": m, "description": WMUtils.get_method(m).get_usage()} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) E TypeError: RobustXmpWatermark.get_usage() takes 0 positional arguments but 1 was given server.py:1137: TypeError ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_get_watermarking_methods_route - TypeError: ... 1 failed, 13 passed, 22 warnings in 21.12s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2733"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2733_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2733_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-success" id="job_list___sub_heading_2733_1"><button class="btn btn-outline-success"><span class="job_id">2733 : Job ID a22abe249f6f4316a9e44672d4590b6b</span></button></div></a><div aria-labelledby="job_list___sub_heading_2733_1" data-parent="#job_list___sub_accordion_2733" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2733_1"><div class="card-body"><div class="work-item"><div class="alert alert-success test-outcome" role="alert"><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.KILLED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=328" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (328, 17), end pos: (328, 44)</button></a></pre><pre>operator: core/ZeroIterationForLoop, occurrence: 0</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -325,7 +325,7 @@ fragment_size = len(payload_bytes) // self._FRAGMENT_COUNT + 1 fragments = [] - for i in range(self._FRAGMENT_COUNT): + for i in []: start = i * fragment_size end = min(start + fragment_size, len(payload_bytes)) fragment = payload_bytes[start:end]</pre></div><div class="alert alert-secondary"><pre class="diff">...F.....F...F [100%] ================================== FAILURES =================================== _________________________ test_upload_document_route __________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_upload_document_route(client): """Test document upload endpoint.""" file_path = script_dir / "storage" / "files" / "username" / "input.pdf" #open dummy file with open(file_path, "rb") as f: parameters = { "file": (f, "input.pdf"), "name": "My File" } resp = client.post("/api/upload-document", data=parameters, content_type='multipart/form-data') resp_data = resp.get_json() #tests when fully functional #basic tests assert resp.status_code == 201 assert resp.is_json #check types assert isinstance(resp_data.get("id"), int) #was string! Specification is wrong. assert isinstance(resp_data.get("name"), str) assert isinstance(resp_data.get("creation"), str) and datetime.fromisoformat(resp_data.get("creation")) assert isinstance(resp_data.get("sha256"), str) assert isinstance(resp_data.get("size"), int) #check value assert resp_data.get("name") == parameters["name"] #Test with missing file resp = client.post("/api/upload-document") assert resp.status_code == 400 #Test with too big file, 51 Mb content = b"%PDF-1.4\n" + b"0" * (50 * 1024 * 1024 + 1) # 50MB + 1 byte stream = BytesIO(content) file_storage = FileStorage(stream=stream, filename="bigfile.pdf", content_type="application/pdf") #Need to patch the content length, not included in flask test server with patch.object(FileStorage, 'content_length', new_callable=PropertyMock) as mock_content_length: mock_content_length.return_value = len(content) data = { 'file': (file_storage.stream, file_storage.filename, file_storage.content_type), 'name': 'My Big File' } &gt; resp = client.post("/api/upload-document", data=data, content_type='multipart/form-data') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..\test\test_api.py:180: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1167: in post return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\testing.py:235: in open response = super().open( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ server.py:103: in wrapper return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ server.py:301: in upload_document if "file" not in request.files: ^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\utils.py:107: in __get__ value = self.fget(obj) # type: ignore ^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:497: in files self._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\flask\wrappers.py:198: in _load_form_data super()._load_form_data() C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\wrappers\request.py:271: in _load_form_data data = parser.parse( C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:242: in parse return parse_func(stream, mimetype, content_length, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:267: in _parse_multipart form, files = parser.parse(stream, boundary, content_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\werkzeug\formparser.py:391: in parse _write(event.data) C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:830: in write rv = file.write(s) ^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',) kwargs = {} @_functools.wraps(func) def func_wrapper(*args, **kwargs): &gt; return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ E OSError: [Errno 28] No space left on device C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\tempfile.py:483: OSError ------------------------------ Captured log call ------------------------------ WARNING server:server.py:303 Upload attempt missing 'file' field _________________________ test_create_watermark_route _________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_create_watermark_route(client): """Test create watermark endpoint.""" parameters = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse", "id": 1} parameters_no_id = {"method": "robust-xmp", "position": "metadata-only", "key": "key", "secret": "secret", "intended_for":"Mickey Mouse"} resp = client.post("/api/create-watermark", json=parameters) #resp = client.post("/apicreate-watermark/1", json=parameters_no_id) data = resp.get_json() #basic tests &gt; assert resp.status_code == 201 E assert 500 == 201 E + where 500 = &lt;WrapperTestResponse 45 bytes [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:322: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:server.py:1056 Failed to write watermarked file C:\Users\franc\Documents\GitHub\softsec-tatou\server\src\storage\files\username\watermarks\My File__Mickey_Mouse.pdf for document 1: [Errno 28] No space left on device _____________________________ test_rmap_get_link ______________________________ client = &lt;FlaskClient &lt;Flask 'server'&gt;&gt; def test_rmap_get_link(client): # Step 0: Create RMAP service user to assign document to resp = client.post("/api/create-user", json={ "login": "rmap_service", "password": "password_rmap", "email": "service@rmap.su", }) # pragma: allowlist secret # Step 1: Initiate RMAP to get nonceServer test_nonce = 12345678 test_identity = "Group_13" encrypted_payload = encrypt_payload_for_server({ "nonceClient": test_nonce, "identity": test_identity }) response = client.post("/api/rmap-initiate", json={"payload": encrypted_payload}) assert response.status_code == 200 json_data = response.get_json() assert "payload" in json_data # Decrypt response to get the actual nonceServer decrypted = decrypt_server_response( json_data["payload"], client_privkey_path=str(Path(__file__).parent.parent / "client_keys" / "group13-private.asc"), passphrase=os.environ.get("PRIVKEY_PASSPHRASE", "") ) nonce_server = decrypted["nonceServer"] # Step 2: Use that nonceServer in the rmap-get-link call encrypted_payload = encrypt_payload_for_server({ "nonceServer": nonce_server }) response = client.post("/api/rmap-get-link", json={"payload": encrypted_payload}) &gt; assert response.status_code == 200 E assert 500 == 200 E + where 500 = &lt;WrapperTestResponse streamed [500 INTERNAL SERVER ERROR]&gt;.status_code ..\test\test_api.py:571: AssertionError ------------------------------ Captured log call ------------------------------ ERROR server:rmap_handler.py:352 Failed to create watermarked PDF for session 0000000000bc614e4b5060e8fe793c10: [Errno 28] No space left on device ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED ..\test\test_api.py::test_upload_document_route - OSError: [Errno 28] ... FAILED ..\test\test_api.py::test_create_watermark_route - assert 500 == 201 FAILED ..\test\test_api.py::test_rmap_get_link - assert 500 == 200 3 failed, 11 passed, 22 warnings in 20.21s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2734"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2734_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2734_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2734_1"><button class="btn btn-outline-danger"><span class="job_id">2734 : Job ID 6c194a308c8f48a4be983f8f1285ef0b</span></button></div></a><div aria-labelledby="job_list___sub_heading_2734_1" data-parent="#job_list___sub_accordion_2734" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2734_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=335" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (335, 28), end pos: (335, 48)</button></a></pre><pre>operator: core/ZeroIterationForLoop, occurrence: 1</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -332,7 +332,7 @@ fragments.append(fragment) # Add fragments to PDF as annotations or form fields - for _i, fragment in enumerate(fragments): + for _i, fragment in []: try: if doc.page_count &gt; 0: page = doc.load_page(0) # Use first page</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.18s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2735"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2735_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2735_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2735_1"><button class="btn btn-outline-danger"><span class="job_id">2735 : Job ID 9f47e234e7f44584897c4eaa242800d7</span></button></div></a><div aria-labelledby="job_list___sub_heading_2735_1" data-parent="#job_list___sub_accordion_2735" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2735_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=396" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (396, 28), end pos: (396, 57)</button></a></pre><pre>operator: core/ZeroIterationForLoop, occurrence: 2</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -393,7 +393,7 @@ fragments = {} # Look for annotations with our fragment pattern - for page_num in range(min(doc.page_count, 5)): # Check first few pages only + for page_num in []: # Check first few pages only page = doc.load_page(page_num) annots = page.annots() </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.40s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2736"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2736_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2736_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2736_1"><button class="btn btn-outline-danger"><span class="job_id">2736 : Job ID 21670554bc5340839944d798022279f7</span></button></div></a><div aria-labelledby="job_list___sub_heading_2736_1" data-parent="#job_list___sub_accordion_2736" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2736_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=400" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (400, 29), end pos: (400, 35)</button></a></pre><pre>operator: core/ZeroIterationForLoop, occurrence: 3</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -397,7 +397,7 @@ page = doc.load_page(page_num) annots = page.annots() - for annot in annots: + for annot in []: try: content = annot.info.get("content", "") author = annot.info.get("title", "") # Sometimes title is used</pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.31s </pre></div></div></div></div></div><div class="mb-1" id="job_list___sub_accordion_2737"><div class="card"><a data-toggle="collapse" data-target="#job_list___sub_collapse_2737_1" aria-expanded="false" aria-controls="job_list___sub_collapse_2737_1" href="#" class="job_list___sub_multi_heading"><div role="alert" class="card-header alert-danger" id="job_list___sub_heading_2737_1"><button class="btn btn-outline-danger"><span class="job_id">2737 : Job ID 6461d3c90af84c249626fb2fab9d8ea7</span></button></div></a><div aria-labelledby="job_list___sub_heading_2737_1" data-parent="#job_list___sub_accordion_2737" class="collapse job_list___sub_multi_collapse" id="job_list___sub_collapse_2737_1"><div class="card-body"><div class="work-item"><div class="alert alert-danger test-outcome" role="alert"><p>SURVIVED</p><p>worker outcome: WorkerOutcome.NORMAL</p><p>test outcome: TestOutcome.SURVIVED</p></div></div><pre class="location"><a href="pycharm://open?file=robust_xmp_watermark.py&amp;line=420" class="text-secondary"><button class="btn btn-outline-dark">robust_xmp_watermark.py, start pos: (420, 25), end pos: (420, 49)</button></a></pre><pre>operator: core/ZeroIterationForLoop, occurrence: 4</pre><div class="alert alert-secondary"><pre class="diff">--- mutation diff --- --- arobust_xmp_watermark.py +++ brobust_xmp_watermark.py @@ -417,7 +417,7 @@ # Reconstruct payload from fragments if len(fragments) &gt;= self._MIN_FRAGMENTS: reconstructed = b"" - for i in sorted(fragments.keys()): + for i in []: reconstructed += fragments[i] return reconstructed.decode("utf-8") </pre></div><div class="alert alert-secondary"><pre class="diff">.............. [100%] ============================== warnings summary =============================== ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:5: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 import imghdr &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute &lt;frozen importlib._bootstrap&gt;:488 &lt;frozen importlib._bootstrap&gt;:488: DeprecationWarning: builtin type swigvarlink has no __module__ attribute ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21 C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyPDF2\__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead. warnings.warn( ..\..\..\..\..\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: 1 warning test/test_api.py: 14 warnings C:\Users\franc\AppData\Local\Programs\Python\Python312\Lib\site-packages\pgpy\constants.py:193: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from cryptography.hazmat.primitives.ciphers.algorithms in 48.0.0. SymmetricKeyAlgorithm.TripleDES: algorithms.TripleDES, -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 14 passed, 22 warnings in 20.19s </pre></div></div></div></div></div></div></div></div></div></div><script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script><script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script><script type="text/javascript">$('div.job_list___sub_multi_collapse').on('shown.bs.collapse', function () { correct_behavior_functional_buttons(); });$('div.job_list___sub_multi_collapse').on('hidden.bs.collapse', function () { correct_behavior_functional_buttons(); });function correct_behavior_functional_buttons() { var expand = false; var collapse = false; $('a.job_list___sub_multi_heading').each(function(index) { if ($(this).attr('aria-expanded') == 'false') { expand = true; return false; }; }); $('a.job_list___sub_multi_heading').each(function(index) { if ($(this).attr('aria-expanded') == 'true') { collapse = true; return false; }; }); if (expand) { $('div#job_item_expand_all').css('display', 'inline-block'); } else { $('div#job_item_expand_all').css('display', 'none'); }; if (collapse) { $('div#job_item_collapse_all').css('display', 'inline-block'); } else { $('div#job_item_collapse_all').css('display', 'none'); }; };correct_behavior_functional_buttons();</script></body></html>